多模块项目中Log4j1与Log4j2日志格式不一致问题咨询
问题原因解析
咱们直接拆解你遇到的这个日志格式不一致的问题,核心原因其实是两个模块用了完全独立的日志框架,各自走自己的配置逻辑:
1. Log4j1和Log4j2的配置隔离性
Log4j 1.x和Log4j 2.x是两套不兼容的日志实现,它们的配置文件、默认行为完全独立:
- 你的Rest模块用的是Log4j1,而且明显已经做了自定义配置(比如
log4j.properties或者log4j.xml),把日志格式改成了%p | %m这种简洁样式,也就是你看到的「INFO | rest controller 1」这类输出; - M1模块升级到了Log4j2 2.13.1,它用的是Log4j2的默认配置(或者模块内部自带了Log4j2的配置)。你看到的M1日志格式——
2020-03-29 23:34:54.316 INFO 18602 --- [container1] c.t.v.c.a.Handler : Wating for the result——确实是Log4j2的默认输出样式之一,尤其是如果M1是Spring Boot项目的话,Spring Boot整合Log4j2时默认就会用这种包含时间戳、进程ID、线程名、类名的格式。
2. 同一文件的多框架输出逻辑
虽然两个模块的日志都写到同一个文件里,但它们是通过各自框架的Appender实例来写入的:
- Log4j1的Appender负责输出Rest模块的日志,严格遵循你自定义的格式;
- Log4j2的Appender负责输出M1模块的日志,遵循它自己的默认(或模块内配置的)格式;
- 这两个框架之间不会共享配置信息,所以最终日志文件里就会出现两种截然不同的格式。
快速验证方法
你可以通过这两步确认我的判断:
- 检查Rest模块的
log4j.properties/log4j.xml,应该能找到类似这样的配置:log4j.appender.[你的文件Appender名].layout=org.apache.log4j.PatternLayout log4j.appender.[你的文件Appender名].layout.ConversionPattern=%p | %m%n - 检查M1模块的
log4j2.xml/log4j2.properties,如果没有自定义的PatternLayout配置,那肯定是用了Log4j2的默认格式;如果有配置,那就是模块里显式设置了这种带时间、线程的格式。
可选:统一日志格式的方案
如果想让两个模块的日志格式统一,有两种思路:
- 推荐方案:把Rest模块也升级到Log4j2 2.13.1(毕竟Log4j1已经停止维护很久了,还有安全隐患),然后在统一的Log4j2配置文件里设置相同的PatternLayout;
- 临时方案:如果暂时没法升级Rest模块,可以在M1模块的Log4j2配置里手动改成和Rest一致的格式,比如在
log4j2.xml里这么写:<PatternLayout pattern="%p | %m%n"/>
内容的提问来源于stack exchange,提问作者user1540385
相关产品推荐
相关产品推荐

