MAVEN项目仅引入log4j依赖无xml配置时日志重复打印问题求助
无log4j配置文件场景下日志重复打印的解决方案
问题原因
你遇到的重复打印是log4j 1.x的默认初始化逻辑导致的:没有显式配置文件时,log4j会自动调用BasicConfigurator初始化控制台输出器,如果项目中存在传递依赖的日志桥接包、或者多个启动上下文触发了多次初始化,就会注册多个重复的控制台输出器,最终每条日志打印多次。
解决方案
方案1:清理pom依赖冲突(无需修改业务代码)
优先排查传递依赖引入的多余日志桥接包,修改log4j依赖配置增加排除项即可:
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <exclusions> <!-- 排除冲突的commons-logging桥接组件 --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <!-- 排除重复引入的slf4j-log4j桥接组件 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
修改后执行mvn clean install重新构建项目即可生效。
方案2:代码手动初始化log4j配置(无需新增xml文件)
如果排除依赖后问题仍然存在,可以在项目启动入口的最前端添加静态初始化代码,主动清空重复注册的输出器,仅保留一个控制台输出器:
import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; // 启动类静态代码块,优先级最高,会在所有日志打印前执行 static { // 清空所有已注册的日志输出器,解决重复注册问题 Logger.getRootLogger().removeAllAppenders(); // 手动注册单个控制台输出器,和默认输出格式保持一致 Logger.getRootLogger().addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %-5p %c - %m%n"))); }
该方案不需要新增任何xml配置文件,仅需要添加几行初始化代码即可完全解决重复打印问题。
内容的提问来源于stack exchange,提问作者sunil
相关产品推荐
相关产品推荐

