从Logback切换至Log4j后部分日志信息缺失的问题咨询
日志框架切换问题:Logback转Log4j后日志缺失及事务日志不生效
操作背景
为满足业务需求,将日志框架从Logback切换为Log4j,已完成以下配置:
1. 修改pom.xml排除Logback并引入Log4j依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency>
2. 添加log4j.properties配置文件
log4j.rootLogger=INFO,Console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n
出现的问题
1. 核心启动日志缺失
切换后,日志丢失了应用启动、Spring容器初始化等关键信息:
- Logback时期的完整日志:
2022-11-15 18:43:05.819 INFO 13700 --- [ main] en.main.com.Application : Starting Application using Java 11.0.14 on '' with PID 13700 2022-11-15 18:43:06.710 INFO 13700 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=eb6a152f-721c-3012-b9ce-880d2bbbe06c 2022-11-15 18:43:06.967 INFO 13700 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) 2022-11-15 18:43:06.974 INFO 13700 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-11-15 18:43:06.974 INFO 13700 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.53] 2022-11-15 18:43:07.158 INFO 13700 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/main] : Initializing Spring embedded WebApplicationContext 2022-11-15 18:43:07.159 INFO 13700 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1298 ms 2022-11-15 18:43:07.898 INFO 13700 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/main' 2022-11-15 18:43:07.985 INFO 13700 --- [ main] en.main.com.Application : Started Application in 2.648 seconds (JVM running for 3.726)
- 切换为Log4j后的日志:
2022-11-15 18:38:00,817 INFO - Initializing ProtocolHandler ["http-nio-8081"] 2022-11-15 18:38:00,818 INFO - Starting service [Tomcat] 2022-11-15 18:38:00,818 INFO - Starting Servlet engine: [Apache Tomcat/9.0.53] 2022-11-15 18:38:01,057 INFO - Initializing Spring embedded WebApplicationContext 2022-11-15 18:38:02,890 INFO - Starting ProtocolHandler ["http-nio-8081"] 2022-11-15 18:38:03,001 INFO - HikariPool-1 - Starting... 2022-11-15 18:38:03,318 INFO - HikariPool-1 - Start completed. 2022-11-15 18:38:03,340 INFO - HikariPool-2 - Starting... 2022-11-15 18:38:03,397 INFO - HikariPool-2 - Start completed.
2. 事务日志配置未生效
尝试添加以下配置开启事务相关DEBUG日志,但无任何输出:
log4j.logger.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG
原因分析
- 依赖版本不兼容:
spring-boot-starter-log4j是针对Log4j 1.x的依赖,而Spring Boot 2.x及以上版本对Log4j 1.x的适配性极差,Log4j 1.x已停止维护,无法正确捕获Spring核心组件的日志输出。 - 日志配置缺失:当前
log4j.properties仅配置了根日志级别,未单独为Spring框架、应用主类等组件指定日志级别,导致这些组件的日志被过滤。 - 事务日志不生效:一方面是Log4j 1.x的适配问题导致日志框架未正确加载配置;另一方面,若事务未实际触发也不会输出日志,但核心原因还是依赖和配置的问题。
解决办法
1. 替换为Log4j2依赖(推荐方案)
Spring Boot官方推荐使用Log4j2作为日志框架,替换pom.xml中的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2. 调整日志配置
若坚持使用Log4j 1.x
修改log4j.properties,添加Spring组件和应用类的日志级别配置:
log4j.rootLogger=INFO,Console # 开启Spring核心组件的INFO级别日志 log4j.logger.org.springframework=INFO # 替换为你的应用主类所在包 log4j.logger.en.main.com=INFO log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout # 补充PID、线程、类名信息,和Logback格式对齐 log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %X{PID} --- [%t] %c{1} : %m%n # 开启事务管理器的DEBUG日志 log4j.logger.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG
若改用Log4j2(推荐)
创建log4j2.properties配置文件:
status = warn name = PropertiesConfig appenders = console appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout # 日志格式和Logback保持一致 appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %pid --- [%t] %c{1} : %m%n # 配置Spring框架日志 logger.spring.name = org.springframework logger.spring.level = INFO logger.spring.additivity = false logger.spring.appenderRefs = STDOUT logger.spring.appenderRef.stdout.ref = STDOUT # 配置应用主类日志 logger.app.name = en.main.com logger.app.level = INFO logger.app.additivity = false logger.app.appenderRefs = STDOUT logger.app.appenderRef.stdout.ref = STDOUT # 配置事务管理器DEBUG日志 logger.tx.name = org.springframework.jdbc.datasource.DataSourceTransactionManager logger.tx.level = DEBUG logger.tx.additivity = false logger.tx.appenderRefs = STDOUT logger.tx.appenderRef.stdout.ref = STDOUT rootLogger.level = INFO rootLogger.appenderRefs = STDOUT rootLogger.appenderRef.stdout.ref = STDOUT
3. 验证效果
- 重启应用,检查是否输出完整的Spring启动、容器初始化日志
- 触发一次事务操作(比如数据库增删改),查看是否有DEBUG级别的事务日志输出
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

