Log4j:多个记录器,级别和追加器

时间:2012-11-29 13:48:52

标签: log4j

使用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属性之前一样)并且仍然阻止重复的日志消息?

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

1 个答案:

答案 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