Spring Boot主项目的非Spring依赖项目无法读取自身Log4j配置问题
问题根本原因
- Log4j的配置上下文是JVM全局唯一的,应用启动时只会加载类路径下优先级最高的一份log4j配置文件,子依赖jar包中的log4j.properties会被主项目的同文件名配置覆盖,根本不会被读取。
- 你同时引入了Log4j 1.x和Log4j 2.x两套依赖,存在日志实现冲突,项目B的日志输出走的是Log4j默认的兜底配置,才会出现无自定义格式的输出。
解决方案
第一步:统一日志依赖,排除冲突
首先清理所有子项目和主项目的日志依赖,统一用一套日志实现,避免冲突:
- 所有子项目(项目B、另一个依赖项目)的pom.xml中,把log4j相关依赖的scope改为
provided,避免打包到jar中,依赖由主项目统一提供:
<!-- 子项目pom.xml中log4j依赖调整 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.0</version> <scope>provided</scope> </dependency>
- 主项目pom.xml中添加log4j-1.2-api桥接包,兼容Log4j 1.x的日志调用:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> <version>2.14.0</version> </dependency>
第二步:统一在主项目配置所有模块的日志规则
删除所有子项目resources下的log4j.properties配置,所有日志规则都在主项目的log4j配置中统一配置,直接追加项目B和另一个依赖的日志规则即可:
# 原有主项目配置保持不变 log4j.logger.com.example.MainProject=DEBUG, consoleAppender, FILE log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender log4j.appender.consoleAppender.layout=org.apache.log4j.EnhancedPatternLayout log4j.appender.consoleAppender.layout.ConversionPattern=[MainProject] - %-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} - %C:%M:%L - %m%n ## File Appender log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.File=/opt/app/log/MainProject.log log4j.appender.FILE.DatePattern='_'yyyy-MM-dd log4j.appender.FILE.layout=org.apache.log4j.EnhancedPatternLayout log4j.appender.FILE.layout.ConversionPattern=[MainProject] - %-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} - %C:%M:%L - %m%n log4j.additivity.com.example.MainProject=false # 追加项目B的日志规则 log4j.logger.com.example.ProjectB=DEBUG, projectBConsole log4j.appender.projectBConsole=org.apache.log4j.ConsoleAppender log4j.appender.projectBConsole.Target=System.out log4j.appender.projectBConsole.layout=org.apache.log4j.PatternLayout log4j.appender.projectBConsole.layout.ConversionPattern=[ProjectB] - %-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} - %C:%M:%L - %m%n log4j.additivity.com.example.ProjectB=false # 按照相同格式追加另一个依赖项目的日志规则即可
注意:不同模块的appender名称不能重复,比如项目B的appender不要和主项目的
consoleAppender重名,避免配置覆盖。
第三步:验证效果
重新打包主项目启动后,不同模块的日志会按照配置的各自格式输出,不会再出现默认格式的日志。
内容的提问来源于stack exchange,提问作者Fernando Caria
相关产品推荐
相关产品推荐

