如何跟踪Log4j或Sl4j加载哪个配置文件进行初始化

当遇到自定义的log4j.properties配置文件无效时,可能是因为log4j优先查找log4j.xml。解决办法是在Java启动参数中加入-Dlog4j.debug,运行时将在控制台显示加载配置的详细步骤,帮助定位问题。

场景:在实际的开发当中,经常会出现自己写的log4j.properties配置文件无效,要怎么跟踪实际加载的是哪个配置文件呢?

在log4j.properties和log4j.xml两个文件都存在的时候,log4j框架默认先找log4.xml文件,很可能引入的log4j.jar包中存在log4.xml文件,导致了自己写的配置文件无效!!

 

解决方案:

   在Java命令中添加-Dlog4j.debug虚拟机参数,这样在使用log4j框架的时候,会在Console控制台打印出加载配置文件的步骤信息

 

本案例的log4j.properties:

#日志级别大小: DEBUG < INFO < WARN < ERROR < FATAL
#log4j.rootLogger 配置的是大于等于当前级别的日志信息的输出
#log4j.rootLogger 用法:(注意appenderName可以是一个或多个)
#log4j.rootLogger = 日志级别,appenderName1,appenderName2,....
#log4j.appender.appenderName1定义的是日志的输出方式,有两种:一种是命令行输出或者叫控制台输出,另一种是文件方式保存
#                            1)控制台输出则应该配置为org.apache.log4j.PatternLayout
#                            2)文本方式保存应该配置为org.apache.log4j.DailyRollingFileAppender
#                            3)也可以自定义 Appender类
#log4j.appender.appenderName1.layout.ConversionPattern 定义的是日志内容格式
#log4j.appender.appenderName1.file 定义了该日志文件的文件名称
#log4j.appender.appenderName1.DatePattern 定义了日志文件重新生成的时间间隔,如果设置到天,则每天重新生成一个新的日志文件。
#                                         旧的日志文件则以新的文件名保存,文件名称 = log4j.appender.appenderName1.file + log4j.appender.appenderName1.DatePattern 
#log4j.rootLogger = info,stdout,file 
log4j.rootLogger = info,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
#log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.file=d\:\\log\\info(+).log
#log4j.appender.file.DatePattern= '.'yyyy-MM-dd
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n


# log4j.logger 用法如下
#              1)log4j.logger.包名 = 日志级别 , appenderName1,appenderName2,....
#                 定义该包名下的所有类的日志输出
#              2)log4j.logger.类全名含包名 = 日志级别 , appenderName1,appenderName2,....
#                 定义指定类的日志输出
#              3) log4j.logger.日志对象Logger命名名称 = 日志级别 , appenderName1,appenderName2,....
#                 定义了某命名名称的日志的 输出,如: 
#                 log4j.logger.Log1 就是指定义通过 Logger.getLogger("Log1") 获取的日志对象的日志输出

log4j.logger.edu.mvcdemo.controller = debug,controller_logfile
log4j.appender.controller_logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.controller_logfile.file=d\:\\log\\controller_logfile.log
log4j.appender.controller_logfile.DatePattern= '.'yyyy-MM-dd
log4j.appender.controller_logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.controller_logfile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n

加载配置文件过程,打印的信息如下:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@9e4f7c.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@9e4f7c class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@9e4f7c.
log4j: Using URL [file:/D:/EclipseWorkspace/MavenSpringMvcDemo/target/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/D:/EclipseWorkspace/MavenSpringMvcDemo/target/classes/log4j.properties
log4j: Parsing for [root] with value=[info,stdout].
log4j: Level token is [info].
log4j: Category root set to INFO
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n].
log4j: End of parsing for "stdout".
log4j: Parsed "stdout" options.
log4j: Parsing for [edu.mvcdemo.controller] with value=[debug,controller_logfile].
log4j: Level token is [debug].
log4j: Category edu.mvcdemo.controller set to DEBUG
log4j: Parsing appender named "controller_logfile".
log4j: Parsing layout options for "controller_logfile".
log4j: Setting property [conversionPattern] to [[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n].
log4j: End of parsing for "controller_logfile".
log4j: Setting property [file] to [d:\log\controller_logfile.log].
log4j: Setting property [datePattern] to ['.'yyyy-MM-dd].
log4j: setFile called: d:\log\controller_logfile.log, true
log4j: setFile ended
log4j: Appender [controller_logfile] to be rolled at midnight.
log4j: Parsed "controller_logfile" options.
log4j: Handling log4j.additivity.edu.mvcdemo.controller=[null]
log4j: Finished configuring.


 

<think>好的,用户问怎么把log4j改成sl4j。首先,我需要确认用户的需求。他们可能是在项目中使用了log4j,现在想换成slf4j,可能是为了更好的灵活性者项目规范。需要明确的是,slf4j是一个门面,通常需要和具体的实现绑定,比如logbacklog4j2。所以用户的问题可能更准确地说是迁移到slf4j绑定的某个实现。 接下来,我得考虑用户当前的环境。如果他们之前用的是log4j(即log4j1.x),可能需要先迁移到log4j2,者直接换成logback,因为slf4j对log4j1的支持已经停止了。不过用户可能希望直接换成slf4j+logback者其他实现。需要分步骤说明。 然后,用户可能关心依赖管理。比如在Maven项目中,需要排除旧的log4j依赖,添加slf4j和具体实现的依赖。比如排除log4j-core、log4j-api,然后添加slf4j-api和logback-classiclog4j2的绑定。 另外,代码中的日志调用也需要修改。原来的import org.apache.log4j.Logger需要改成org.slf4j.Logger,同时将获取Logger的方式从LogManager改为LoggerFactory。比如Logger.getLogger变成LoggerFactory.getLogger。 配置文件的迁移也是一个重点。如果换成logback,原来的log4j.properties需要转换为logback-spring.xmllogback.xml,这可能需要调整配置结构。如果换成log4j2,可能需要转换为log4j2.xml,但这时候其实还是用log4j2,只是通过slf4j作为接口。 还需要考虑是否有其他依赖库仍然使用log4j,这时候可能需要使用桥接器(比如log4j-over-slf4j)来将这些库的日志输出到slf4j,避免冲突。 可能用户没有提到的深层需求是希望统一日志框架,避免多个日志框架共存导致的问题,者想要利用slf4j提供的更灵活的绑定能力,方便以后切换不同的实现。 最后,测试是关键,迁移后需要验证日志是否正常输出,格式是否正确,路径是否正确,以及性能是否符合预期。 总结步骤:排除旧依赖、添加新依赖、修改代码中的日志类、更新配置文件、处理第三方库的桥接,最后测试验证。</think>以下是将项目从 Log4j 迁移到 SLF4J 的完整指南(以 Logback 为实现为例): --- ### 1. 依赖管理(Maven) **移除旧依赖**: ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j-core</artifactId> <version>1.2.17</version> </dependency> ``` **添加 SLF4J + Logback**: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.11</version> </dependency> ``` --- ### 2. 代码替换 **原 Log4j 写法**: ```java import org.apache.log4j.Logger; private static final Logger logger = Logger.getLogger(MyClass.class); ``` **替换为 SLF4J**: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(MyClass.class); ``` **日志方法替换对照表**: | Log4j 方法 | SLF4J 方法 | |---------------------|--------------------------| | `logger.debug()` | `logger.debug()` | | `logger.info()` | `logger.info()` | | `logger.warn()` | `logger.warn()` | | `logger.error()` | `logger.error()` | | `logger.fatal()` | `logger.error()` + 级别控制 | --- ### 3. 配置文件迁移 **原 `log4j.properties` 示例**: ```properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} [%t] %-5p %c - %m%n ``` **替换为 `logback-spring.xml`**: ```xml <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration> ``` --- ### 4. 处理第三方依赖桥接 如果项目中存在其他依赖仍使用 `log4j`,需添加桥接器: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>2.0.9</version> </dependency> ``` --- ### 5. 验证迁移 1. 删除旧的 `log4j.properties` 2. 添加 `logback-spring.xml` 到 `src/main/resources` 3. 运行测试代码: ```java public class TestLogger { private static final Logger logger = LoggerFactory.getLogger(TestLogger.class); public static void main(String[] args) { logger.info("SLF4J 已启动"); } } ``` --- ### 6. 进阶配置(可选) - **日志级别动态控制**:使用 `Spring Boot Actuator` 的 `/actuator/loggers` 端点 - **异步日志**:在 `logback.xml` 中配置 `<appender class="ch.qos.logback.classic.AsyncAppender">` - **日志脱敏**:通过自定义 `Converter` 实现敏感数据过滤 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值