Maven应用调用Log4j2依赖Jar后主日志混入依赖日志文件求助
解决Log4j2多配置文件导致日志重复输出到依赖Jar日志文件的问题
问题原因
Log4j 2会自动加载classpath下所有的log4j2配置文件,你的主应用和依赖Jar中都存在log4j2.properties,这些配置会被合并生效。由于两个配置里的appender、logger名称完全一致(比如都叫LogToRollingFile、logger.app),合并后rootLogger会同时关联两个RollingFile appender,最终导致主应用的日志既输出到自己的文件,也输出到依赖Jar指定的文件中。
解决方案
方案1:移除依赖Jar中的log4j2配置(推荐)
作为依赖库,不应该自带日志配置,日志规则应由主应用统一管理。直接删除依赖Jar里的log4j2.properties文件,或者在打包依赖Jar时排除该文件。这样主应用的配置会完全生效,依赖Jar的日志会遵循主应用的输出规则。
方案2:修改依赖Jar的配置,避免名称冲突
如果必须保留依赖Jar的独立日志配置,修改其log4j2.properties中的关键名称,避免和主应用重复:
- 修改appender名称:将
appender.rolling.name改为LogToRollingFile_Dependency,控制台appender同理改为LogToConsole_Dependency - 修改logger名称:将
logger.app.name改为依赖Jar专属的包路径(不要和主应用的com.indra重复),或者重命名logger节点 - 更新所有appender引用:将logger和rootLogger的appenderRef指向新的名称
修改后的依赖Jar配置示例:
status = warn appender.console.type = Console appender.console.name = LogToConsole_Dependency appender.console.layout.type = PatternLayout appender.console.layout.pattern = %5p | %d | %t | %F | %L | %m%n # Rotate log file appender.rolling.type = RollingFile appender.rolling.name = LogToRollingFile_Dependency appender.rolling.fileName = C:/LOG2/dependency.log appender.rolling.filePattern = C:/LOG2/dependency.log.%d{yyyy-MM-dd} appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %5p | %d | %t | %F | %L | %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.strategy.type = DefaultRolloverStrategy # Log to console and rolling file logger.dependency.name = com.indra.dependency # 替换为依赖Jar实际的包名 logger.dependency.level = info logger.dependency.appenderRef.rolling.ref = LogToRollingFile_Dependency logger.dependency.appenderRef.console.ref = LogToConsole_Dependency logger.dependency.additivity=false rootLogger.level = debug rootLogger.appenderRef.rolling.ref = LogToRollingFile_Dependency
方案3:主应用中排除依赖Jar的配置文件
在Maven的pom.xml中,通过插件过滤掉依赖Jar里的log4j2.properties,确保只有主应用的配置生效:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-dependencies</id> <phase>prepare-package</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>依赖Jar的groupId</groupId> <artifactId>依赖Jar的artifactId</artifactId> <version>依赖Jar版本号</version> <excludes>**/log4j2.properties</excludes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者nilesh98
相关产品推荐
相关产品推荐

