You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:07:58