如何在Log4j2中使用Properties文件实现独立多日志文件?
Fix Log Isolation Issue in Log4j2 Properties Configuration
我看了你的配置和代码,问题核心在于Logger的additivity属性设置错误,再加上缺少对Root Logger的明确配置,导致日志会向上传递到父Logger(包括Root),最终出现跨文件重复输出的情况。下面是具体的修复方案:
1. 关闭Logger的Additivity属性
当logger.additivity = true时,当前Logger的日志会传递给它的父Logger的Appender,这就是为什么你的日志会出现在多个文件里。需要把两个自定义Logger的additivity都设为false,切断这种传递关系。
2. 明确配置Root Logger
你的配置中没有定义Root Logger,Log4j2会使用默认的Root Logger配置,这可能会额外输出日志到默认位置(比如控制台)或者继承Appender。我们需要明确配置Root Logger,指定它的Appender或者设置为仅输出到你需要的位置,避免干扰自定义Logger的隔离。
修改后的完整配置文件
status = error dest = err name = PropertiesConfig property.filepath= /ap property.filename =${filepath}/ai.log property.filename1 =${filepath}/file1.log property.filename2 =${filepath}/file2.log filter.threshold.type = ThresholdFilter filter.threshold.level = debug # Console Appender appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # Root Rolling File Appender appender.file.type = RollingFile appender.file.name = RootFile1 appender.file.fileName = ${filename} appender.file.filePattern = ${filepath}/%d{yyyyMMdd}/cpl.mw.%d{yyyyMMdd}.%i.log.gz appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.file.policies.type = Policies appender.file.policies.time.type = TimeBasedTriggeringPolicy appender.file.policies.time.interval = 1 appender.file.policies.time.modulate = true appender.file.policies.size.type = SizeBasedTriggeringPolicy appender.file.policies.size.size=50MB appender.file.strategy.type = DefaultRolloverStrategy appender.file.strategy.max = 20 # File1 Rolling Appender appender.rolling1.type = RollingFile appender.rolling1.name = RollingFile1 appender.rolling1.fileName = ${filename1} appender.rolling1.filePattern = ${filepath}/%d{yyyyMMdd}/cpl.mw.%d{yyyyMMdd}.%i.log.gz appender.rolling1.layout.type = PatternLayout appender.rolling1.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling1.policies.type = Policies appender.rolling1.policies.time.type = TimeBasedTriggeringPolicy appender.rolling1.policies.time.interval = 1 appender.rolling1.policies.time.modulate = true appender.rolling1.policies.size.type = SizeBasedTriggeringPolicy appender.rolling1.policies.size.size=50MB appender.rolling1.strategy.type = DefaultRolloverStrategy appender.rolling1.strategy.max = 20 # File2 Rolling Appender appender.rolling2.type = RollingFile appender.rolling2.name = RollingFile2 appender.rolling2.fileName = ${filename2} appender.rolling2.filePattern = ${filepath}/%d{yyyyMMdd}/cpl.mw.%d{yyyyMMdd}.%i.log.gz appender.rolling2.layout.type = PatternLayout appender.rolling2.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling2.policies.type = Policies appender.rolling2.policies.time.type = TimeBasedTriggeringPolicy appender.rolling2.policies.time.interval = 1 appender.rolling2.policies.time.modulate = true appender.rolling2.policies.size.type = SizeBasedTriggeringPolicy appender.rolling2.policies.size.size=50MB appender.rolling2.strategy.type = DefaultRolloverStrategy appender.rolling2.strategy.max = 20 # Logger Configuration loggers # File1 Logger - 关闭additivity logger.name=file1 logger.level = debug logger.additivity = false logger.appenderRefs = rolling1,stdout logger.appenderRef.rolling1.ref = RollingFile1 logger.appenderRef.stdout.ref = STDOUT # File2 Logger - 关闭additivity logger.name=file2 logger.level = debug logger.additivity = false logger.appenderRefs = rolling2 logger.appenderRef.rolling2.ref = RollingFile2 # 明确配置Root Logger,指定它的Appender logger.name=root logger.level = debug logger.appenderRef.file.ref = RootFile1
3. 验证效果
你的Java调用代码不需要修改,保持原样即可:
private static final Logger logCommon = LogManager.getLogger("file1"); private static final Logger logAnalytics = LogManager.getLogger("file2"); public static void main(String[] args) throws Exception { logCommon.info ("file1 Need it save into commons.log file"); logAnalytics.info ("file2 Only save into analytics.log file"); }
修改后:
logCommon的日志只会出现在file1.log和控制台logAnalytics的日志只会出现在file2.log- Root Logger的日志(如果有其他未指定的Logger输出)会出现在
ai.log
这样就实现了完全的日志隔离存储。
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

