在 java 日志记录中,使用 loggerfactory.getlogger() 的核心做法是传入一个类对象或类名字符串来获取对应的 logger 实例。通常推荐传入当前类的 this.getclass() 或 classname.class,这样能确保日志输出时包含准确的类名信息,便于追踪日志来源。

如何获取特定类的 Logger 实例
直接调用 LoggerFactory.getLogger(YourClass.class) 即可获取该类的 Logger。这样做的好处是 Logger 的名称(Name)会自动设置为该类的全限定名,符合大多数日志框架(如 Logback、Log4j2)的层级命名规范。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
public void createUser(String name) {
if (name == null || name.isEmpty()) {
logger.warn("User name cannot be empty");
return;
}
logger.info("Creating user: {}", name);
// ... business logic
}
}
上述代码展示了标准的用法。首先定义静态常量 logger,避免每次方法调用都重新获取实例,提升性能。在 createUser 方法中,当输入为空时,通过 logger.warn 记录警告;正常流程则通过 logger.info 记录信息,并使用占位符 {} 进行参数绑定,避免字符串拼接开销。
立即学习“Java免费学习笔记(深入)”;
Logger 名称与配置文件匹配规则
Logger 的名称决定了它在日志配置文件中的匹配行为。如果配置文件中定义了 <logger name="com.example.UserService" level="DEBUG"></logger>,那么通过 getLogger(UserService.class) 获取的实例将应用此配置。若未显式配置,Logger 会继承其父 Logger(通常是根 Logger <root></root>)的设置。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OrderService {
private static final Logger logger = LoggerFactory.getLogger(OrderService.class);
public void processOrder(int orderId) {
if (orderId <= 0) {
logger.error("Invalid order ID: {}", orderId);
throw new IllegalArgumentException("Invalid order ID");
}
logger.debug("Processing order: {}", orderId);
}
}
在 OrderService 中,我们处理订单 ID 的有效性检查。当 ID 无效时,记录错误并抛出异常;正常处理时记录调试信息。这种基于类名的 Logger 获取方式,使得在 logback.xml 或 log4j2.xml 中可以精确控制不同模块的日志级别,例如对 UserService 开启 INFO,而对 OrderService 开启 DEBUG,互不干扰。
当 Logger 名称包含包路径时如何过滤日志
由于 getLogger(Class) 生成的名称包含完整包路径,可以通过配置特定包级别的 Logger 来过滤日志。例如,若只想记录 com.example.service 包下的 WARN 及以上级别日志,可配置 <logger name="com.example.service" level="WARN"></logger>。这将影响该包下所有类通过 getLogger 获取的 Logger 实例,实现细粒度的日志控制。


















