【问题标题】:Log4j : Multiple loggers, levels and appendersLog4j:多个记录器、级别和附加程序
【发布时间】:2012-11-17 14:41:46
【问题描述】:

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

目前我正在尝试在我的foo.log 文件中记录名为 foobar 的特定记录器的INFO 级别数据(及更高级别),然后是所有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 属性之前所做的那样)并仍然防止重复的日志消息?

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

【问题讨论】:

    标签: log4j


    【解决方案1】:

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

    1.防止重复的日志消息

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

    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
    

    【讨论】:

    • 这一切都很好,但这不是所要求的。记录器如何区分?最初的问题说只有foobar 转到 foo,包括 foobar 在内的所有记录器都转到 bar
    • 该问题要求一个解决方案,其中 foobar 记录器的所有 INFO 消息转到 foo.log 文件,所有记录器的所有 WARN 消息都转到 bar.log 文件(以及每个日志消息只在相应的文件中写入一次)。
    • 不,所有记录器,不仅仅是foobar 被发送到bar.log。根据问题:“目前,我正在尝试在我的 foo.log 文件中记录名为 foobar 的特定记录器的 INFO 级别数据,然后为 所有记录器记录所有 WARN 级别日志消息> 在 bar.log 文件中。”
    • 我看不出我们在这里所说的不同 - 除了在您的第一句话中,您不承认 WARN 级别消息适用于 所有记录器 发送到bar.log(但你在我原来的问题中复制和粘贴摘录)。
    • 是的,在解决方案中 all loggers 转到 foo.log,该问题仅询问只有 foobar 记录到 foo.log。基本上,如果有 barfoo 记录器的 WARN 消息,它应该 NOT 转到 foobar
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多