Log4j : Multiple loggers, 级别和附加程序

标签 log4j

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

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

因此,重复的日志消息被写入到 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。防止重复的日志消息

日志消息被写入两次,因为我们在 rootLoggerlog4j.logger.foobar 类别中列出了 FOO 附加程序。因此,我们必须删除附加程序并仅在类别中定义日志记录级别:

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

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

<强>2。防止 INFO 级别消息写入 bar.log

由于 log4j.logger.foobar 类别的所有 INFO 级别日志消息都由 rootLogger 中的附加程序继承,因此我们需要停止 BAR 附加器,用于记录 INFO 级别消息。

我们可以通过在 BAR 附加器本身上设置 Threshold 属性来实现此目的:

log4j.appender.BAR.Threshold = WARN

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

关于Log4j : Multiple loggers, 级别和附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627235/

相关文章:

java - log4j:根据类别更改一个附加程序的阈值

java - log4j 记录器覆盖到 jxl.log 文件

soap - 如何在 AXIS 1.x 中使用 Log4J SOAP 请求和响应进行登录?

java - JBoss中如何清除server.log?

c# - log4net 模式为没有完整路径的文件名提供了什么

java - log4j 2配置: appenderRef. xyz.ref?

java - 我使用 log4j 收到异常消息

java - 如何在 Maven 构建期间删除/排除 Log4j?

java - 记录多线程应用程序中的 Activity

java - Log4j 不打印堆栈跟踪