使用 log4j 写入多个日志文件时,我遇到了重复日志消息的问题。
目前,我正在尝试在我的 foo.log
文件中记录名为 foobar 的特定记录器的 INFO
级别数据(及以上)然后是 bar.log
文件中所有记录器的所有 WARN
级别(及以上)日志消息。
因此,重复的日志消息被写入到 foo.log
文件中(每行被记录两次),经过一些快速研究,我发现解决此问题的建议是添加log4j.additivity.foobar=false
到我的属性文件。
这样做的问题是,尽管它可以停止重复行,但来自 foobar 记录器的 WARN
消息永远不会写入 bar.log
文件。
我的log4j属性文件如下:
log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO, FOO
log4j.additivity.foobar = false
log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log
log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log
有谁知道如何将日志消息写入两个日志文件(就像在我开始设置 additivity
属性之前所做的那样)并仍然防止重复的日志消息?
请注意,这是问题的简化摘要。在现实场景中,有多个记录器和两个以上的日志文件
最佳答案
这个问题可以分两部分解决。
<强>1。防止重复的日志消息
日志消息被写入两次,因为我们在 rootLogger 和 log4j.logger.foobar 类别中列出了 FOO 附加程序。因此,我们必须删除附加程序并仅在类别中定义日志记录级别:
log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO
这意味着来自 log4j.logger.foobar 的 INFO 级别消息向上传播到 appenders 中的所有记录器>rootLogger,但只会写入每个日志文件一次。
<强>2。防止 INFO 级别消息写入 bar.log
由于 log4j.logger.foobar 类别的所有 INFO 级别日志消息都由 rootLogger 中的附加程序继承,因此我们需要停止 BAR
附加器,用于记录 INFO 级别消息。
我们可以通过在 BAR 附加器本身上设置 Threshold 属性来实现此目的:
log4j.appender.BAR.Threshold = WARN
这将阻止 INFO 级别的语句记录在 bar.log 文件中,因为它只接受 WARN 及以上级别。
因此完整的 log4j 属性文件如下:
log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO
log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log
log4j.appender.FOO.Threshold = INFO
log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log
log4j.appender.BAR.Threshold = WARN
关于Log4j : Multiple loggers, 级别和附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627235/