如何通过SLF4J获取log4j.xml中配置的两个不同Appender的日志记录器?
用SLF4J获取log4j.xml中配置的多个Logger
没问题,这事儿其实挺简单的,SLF4J 获取 Logger 的逻辑和你在 log4j.xml 里的配置是一一对应的,我给你一步步讲清楚:
第一步:先明确log4j.xml里的Logger标识
你在log4j.xml里配置的每个<logger>标签,它的name属性就是这个Logger的唯一标识,SLF4J就是靠这个标识来找到对应的Logger实例的。举个常见的配置例子:
<!-- 第一个Logger:对应业务服务层,绑定文件输出Appender --> <logger name="com.myapp.service" additivity="false"> <appender-ref ref="ServiceFileAppender"/> </logger> <!-- 第二个Logger:对应数据访问层,绑定控制台输出Appender --> <logger name="com.myapp.dao" additivity="false"> <appender-ref ref="DaoConsoleAppender"/> </logger>
这里的com.myapp.service和com.myapp.dao就是两个Logger的核心标识。
第二步:用SLF4J获取对应的Logger
有两种常用方式,按需选择:
方式一:通过类对象获取(推荐)
如果你的Logger配置的是包名或者类名,直接用类对象作为参数获取Logger就行——这种方式IDE能自动重构,不容易写错名称。
比如在你的Service类里:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserService { // 自动匹配到log4j.xml里的"com.myapp.service" Logger private static final Logger logger = LoggerFactory.getLogger(UserService.class); public void handleUserRequest() { logger.info("用户请求处理完成"); // 这条日志会输出到ServiceFileAppender指定的文件 } }
同理,在Dao类里:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserDao { // 自动匹配到log4j.xml里的"com.myapp.dao" Logger private static final Logger logger = LoggerFactory.getLogger(UserDao.class); public void queryUserInfo() { logger.debug("查询用户信息SQL执行完成"); // 这条日志会输出到DaoConsoleAppender指定的控制台 } }
SLF4J会根据类的全限定名(比如com.myapp.service.UserService)去匹配最接近的Logger配置(这里就是com.myapp.service)。
方式二:直接通过名称字符串获取
如果你的Logger配置的是自定义名称(比如不是包/类名,比如叫paymentLogger),直接传这个名称字符串就行:
// 假设log4j.xml里有<logger name="paymentLogger" ...> private static final Logger paymentLogger = LoggerFactory.getLogger("paymentLogger");
这种方式适合那些不属于某个类/包的独立Logger配置。
小提醒
记得确保你获取Logger时用的标识(类的全限定名或者字符串)和log4j.xml里的name属性完全匹配,或者类属于该Logger的名称空间(比如子类继承父包的Logger配置),这样日志才会按照你配置的Appender输出哦。
内容的提问来源于stack exchange,提问作者Akim Akimov
相关产品推荐
相关产品推荐

