Log4j:多个logging器,关卡和appender

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

目前我正在尝试在我的foo.log文件中logging名为foob​​ar的特定logging器的INFO级别数据(和向上),然后logging bar.log文件中所有logging器的所有WARN级别日志消息(和向上)。

因此,将重复的日志消息写入foo.log文件(每行logging了两次),经过一些快速的研究,我发现解决这个问题的build议是将log4j.additivity.foobar=false添加到我的属性文件。

这个问题是,虽然它停止重复行, foob​​arlogging器的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属性),仍然防止重复的日志消息?

请注意,这是对问题的简单总结。 在现实世界中,有多个logging器和两个以上的日志文件

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

1.防止重复的日志消息

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

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

这意味着来自log4j.logger.foobarINFO级别消息向上传播给rootLogger中的所有appender的logging器,但只会写入每个日志文件一次。

2.阻止将INFO级别的消息写入bar.log

由于logLogger.foobar类别的所有INFO级别日志消息都由rootLogger中的appenderinheritance,因此我们需要停止BAR appender来loggingINFO级别消息。

我们可以通过在BAR appender本身上设置Threshold属性来实现:

 log4j.appender.BAR.Threshold = WARN 

这将阻止在bar.log文件中loggingINFO级别语句,因为它只接受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