48

使用 log4j 写入多个日志文件时,我遇到了重复日志消息的问题。

目前,我正在尝试在我的文件中INFO记录名为foobarfoo.log的特定记录器的级别数据(及以上) ,然后为文件中的所有记录器记录WARN所有级别的日志消息(及以上)。bar.log

结果,重复的日志消息被写入foo.log文件(每行记录两次),经过一些快速研究,我发现解决这个问题的建议是添加log4j.additivity.foobar=false到我的属性文件中。

这样做的问题是,尽管它停止了重复的行,但WARN来自foobar记录器的消息永远不会写入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属性之前所做的那样)并且仍然防止重复的日志消息?

请注意,这是对问题的简化摘要。在现实世界的场景中,有多个记录器和两个以上的日志文件

4

1 回答 1

63

这个问题可以分两部分来解决。

1.防止重复的日志消息

日志消息被写入两次,因为我们在rootLoggerlog4j.logger.foobar类别中都列出了FOO appender 。所以我们必须移除 appender 并且只在 category 中定义日志级别:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

这意味着来自log4j.logger.foobar的INFO级别消息将向上传播到rootLogger中的附加程序的所有记录器,但只会写入每个日志文件一次。

2.防止INFO级别消息写入bar.log

由于log4j.logger.foobar类别的所有 INFO 级别日志消息都由 rootLogger 中的 appender 继承,因此我们需要停止BARappender 以记录INFO级别消息。

我们可以通过设置BAR appender 本身的Threshold属性来实现这一点:

log4j.appender.BAR.Threshold = WARN

这将防止在bar.log文件中记录INFO级别的语句,因为它只接受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
于 2012-11-29T15:28:37.807 回答