在 java 日志记录中,获取 logger 实例最标准的方式是使用 java.util.logging.logger.getlogger() 方法并传入当前类的 class 对象。这样做能确保日志输出时自动包含类名信息,便于追踪来源。具体做法是定义一个静态常量,通过 logger.getlogger(classname.class) 初始化,之后即可直接调用该实例进行日志记录。

Logger.getLogger() 返回的是单例吗
是的,Logger.getLogger() 返回的是单例实例。JVM 内部维护了一个 Logger 池,同名或同 Class 对象请求的 Logger 始终指向同一个内存对象。这意味着多次调用该方法不会创建新实例,而是复用已有的 Logger 配置和处理器。

import java.util.logging.Logger;
public class LogExample {
// 获取当前类的 Logger 实例
private static final Logger logger = Logger.getLogger(LogExample.class.getName());
public void doWork() {
logger.info("开始执行任务");
// 业务逻辑
logger.fine("任务完成");
}
public static void main(String[] args) {
LogExample example = new LogExample();
example.doWork();
// 验证单例:再次获取同一类的 Logger
Logger anotherRef = Logger.getLogger(LogExample.class.getName());
System.out.println("Is same instance: " + (example.logger == anotherRef));
}
}
使用 Class 对象作为参数有什么优势
使用 Class 对象作为参数可以自动提取类的全限定名作为 Logger 名称。这符合层级命名规范,允许通过包名过滤日志级别。例如,设置 com.example 为 WARNING,则其下所有子包的日志都会受影响。相比硬编码字符串,这种方式更安全且易于管理。

import java.util.logging.Logger;
public class ServiceA {
private static final Logger logger = Logger.getLogger(ServiceA.class.getName());
public void process() {
logger.warning("Service A warning");
}
}
public class ServiceB {
private static final Logger logger = Logger.getLogger(ServiceB.class.getName());
public void process() {
logger.warning("Service B warning");
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











