LOG4J - 在日志中避免两次相同的消息

时间:2012-01-25 15:07:31

标签: java log4j

这是我的log4j.properties文件

# Set loggers' levels
log4j.rootLogger=warn, trace_file

# Appender
log4j.appender.trace_file=org.apache.log4j.RollingFileAppender
log4j.appender.trace_file.Append=true
log4j.appender.trace_file.File=log/myLog.log
log4j.appender.trace_file.MaxFileSize=10MB
log4j.appender.trace_file.MaxBackupIndex=50

# PatternLayout
log4j.appender.trace_file.layout=org.apache.log4j.PatternLayout
log4j.appender.trace_file.layout.ConversionPattern=%d [%p] (%F:%L) %m%n

# Classes
log4j.logger.my_package=info, trace_file

我想要的是什么:

  • 将来自my.package的{​​{1}}的日志请求存储至少trace_file
  • 仅在INFO trace_file中存储来自所有其他记录器的日志请求,如果它至少为WARN级别

我的配置不起作用。如果my.package引发级别WARN的日志请求,则此日志请求将被写入两次。如果我使用两个单独的appender,则没有问题。

我错过了什么?

6 个答案:

答案 0 :(得分:6)

尝试从my_package记录器语句中删除“trace_file”指令。

答案 1 :(得分:4)

更改

log4j.logger.my_package=info, trace_file

log4j.logger.my_package=info

默认情况下,Appender从父记录器继承,因此通过为根记录器和trace_file指定my_package,您告诉它执行两次。

答案 2 :(得分:4)

我同意Gevorg。它可能是一个可加性问题。

使用log4j.properties文件的人:

添加log4j.additivity.com.example.package=false。(将org.hibernate替换为您需要的任何包)

使用基于log4j.xml的配置的人:

<logger name="com.example.package" additivity="false">
....
</logger>

答案 3 :(得分:1)

您错过了rootLogger

的角色

来自my_package的警告由trace_file通过root logguer log4j.rootLogger=warn, trace_file捕获,然后由同一个appender通过log4j.logger.my_package=info, trace_file

捕获

我想当你创建第二个appender时,你没有将它指定给rootLogger,是吗?

或者,您只能更改从root继承的级别并保留相同的appender

log4j.logger.my_package=info

答案 4 :(得分:1)

通过以下方式防止appender-additivity:

log4j.additivity.my_package =假

请参阅http://logging.apache.org/log4j/1.2/manual.html,“Appenders and Layouts”部分..

引用:

  

Appender可加性   记录器C的日志语句的输出将转到C及其中的所有appender   祖先。这就是“appender additivity”一词的含义。

     

但是,如果记录器C的祖先,比如P,将additivity标志设置为false,那么   C的输出将被定向到C中的所有appender及其祖先和   包括P但不包括P的任何祖先中的追加者。

     

记录器默认情况下将其可加性标志设置为true。

答案 5 :(得分:1)

这看起来像是一个可加性问题。

我不熟悉属性文件配置,但在定义记录器时应该有additivity标志选项。将其设置为false可以解决问题。此外,通过使用xml配置,您可以利用log4j的Filter选项,该选项在属性文件中不可用。

应该是这样的:log4j.logger.my_package.additivity = false

最后,如果您之前没有听说过logback,请查看