Log4j:多个logging器,关卡和appender
使用log4j写入多个日志文件时,遇到重复的日志消息时遇到问题。
目前我正在尝试在我的foo.log
文件中logging名为foobar的特定logging器的INFO
级别数据(和向上),然后logging bar.log
文件中所有logging器的所有WARN
级别日志消息(和向上)。
因此,将重复的日志消息写入foo.log
文件(每行logging了两次),经过一些快速的研究,我发现解决这个问题的build议是将log4j.additivity.foobar=false
添加到我的属性文件。
这个问题是,虽然它停止重复行, foobarlogging器的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.防止重复的日志消息
由于我们在rootLogger和log4j.logger.foobar类别中都列出了FOO appender,所以日志消息被写了两次。 所以我们必须删除appender并且只在类别中定义日志级别:
log4j.rootLogger = WARN, FOO, BAR log4j.logger.foobar = INFO
这意味着来自log4j.logger.foobar的INFO级别消息向上传播给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