使用log4j写入多个日志文件时,我遇到了重复日志消息的问题。
目前我正在尝试在INFO
文件中记录名为 foobar 的特定记录器的foo.log
级数据(及以上),然后记录所有WARN
bar.log
文件中所有记录器的级别日志消息(及更高版本)。
因此,重复的日志消息被写入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
属性之前一样)并且仍然阻止重复的日志消息?
请注意,这是问题的简要摘要。在现实世界中,有多个记录器和两个以上的日志文件
答案 0 :(得分:60)
这个问题可以分两部分来解决。
<强> 1。防止重复的日志消息
日志消息被写了两次,因为我们在 rootLogger 和 log4j.logger.foobar 类别中列出了 FOO appender。因此,我们必须删除appender并仅在类别中定义日志记录级别:
log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO
这意味着来自 log4j.logger.foobar 的 INFO 级别消息会向上传播到 appenders 的所有记录器> rootLogger ,但只会写入每个日志文件一次。
<强> 2。阻止将INFO级别的消息写入bar.log
由于 rootLogger 中的appender正在继承 log4j.logger.foobar 类别的所有INFO级别日志消息,因此我们需要停止{{1用于记录 INFO 级别消息的appender。
我们可以通过在 BAR appender本身设置阈值属性来实现此目的:
BAR
这会阻止 INFO 级别语句记录在 bar.log 文件中,因为它只接受 WARN 级别以及更高级别。
所以完整的log4j属性文件如下:
log4j.appender.BAR.Threshold = WARN