【问题标题】:log4j: configuration causes duplicate messages to be written to the log filelog4j:配置导致将重复消息写入日志文件
【发布时间】:2016-04-15 19:03:04
【问题描述】:

我正在使用 log4j 1.2.17。我尝试配置 log4j.properties 以便将消息写入控制台和日志文件。将消息写入控制台工作正常。每条日志消息我只看到一个条目被写入日志文件。但是,正在将重复消息写入日志文件。换句话说,对于写入日志的每个 INFO,都会写入两次。我尝试使用加法来控制它,但它似乎不起作用。我需要做什么来纠正这种行为?

log4j.rootLogger=ERROR, R, C

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/storefrontPing.log
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %t [%-5p] %c - %m%n
log4j.appender.R.Append = true
log4j.additivity.R = false

log4j.appender.C=org.apache.log4j.ConsoleAppender 
log4j.appender.C.layout=org.apache.log4j.PatternLayout 
log4j.appender.C.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}] %m%n
log4j.appender.C.Target=System.out
log4j.additivity.C = false

log4j.logger.org.apache=ERROR, R
log4j.logger.org.apache=ERROR, C

log4j.logger.com.aktion.storefront.ping=INFO, C
log4j.logger.com.aktion.storefront.ping=INFO, R

修订

我将 log4j.properties 文件更改为以下内容。现在我将日志消息写入控制台,但没有写入日志文件。

log4j.rootLogger=ERROR, R, C

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/storefrontPing.log
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %t [%-5p] %c - %m%n
log4j.appender.R.Append = true

log4j.appender.C=org.apache.log4j.ConsoleAppender 
log4j.appender.C.layout=org.apache.log4j.PatternLayout 
log4j.appender.C.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}] %m%n
log4j.appender.C.Target=System.out

log4j.logger.com.aktion.storefront.ping=INFO

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    Appender 可加性不是在 appender 上而是在 logger 上配置的 (https://logging.apache.org/log4j/1.2/manual.html#additivity)

    由于您已经将附加程序添加到根记录器,因此您无需稍后再次添加它们。您应该仅使用所需的日志级别定义其他记录器:

    log4j.logger.org.apache=ERROR
    log4j.logger.org.apache=ERROR
    
    log4j.logger.com.aktion.storefront.ping=INFO
    log4j.logger.com.aktion.storefront.ping=INFO
    

    而且,由于您没有将日志级别从根记录器更改为 org.apache 记录器,因此您甚至可以省略这些:

    #log4j.logger.org.apache=ERROR
    #log4j.logger.org.apache=ERROR
    
    log4j.logger.com.aktion.storefront.ping=INFO
    log4j.logger.com.aktion.storefront.ping=INFO
    

    【讨论】:

    • 我尝试了您的更改。现在我收到一条写入控制台的日志信息消息,但没有写入日志文件。我包含了一个修改后的 log4j.properties 文件,现在包含在我的问题中。我是不是做错了什么?
    • 我的错。问题是我如何在 Eclipse 中定义本地 Tomcat 服务器。这是有效的。谢谢!
    【解决方案2】:

    additivity 应设置在记录器级别,而不是附加程序,因此在您的情况下删除以下行:

    log4j.additivity.R = false
    log4j.additivity.C = false
    

    并添加:

    log4j.additivity.org.apache=false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多