Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LOG4J-在日志中避免两次相同的消息_Java_Log4j - Fatal编程技术网

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

Java LOG4J-在日志中避免两次相同的消息,java,log4j,Java,Log4j,这是我的log4j.properties文件 #设置记录器的级别 log4j.rootLogger=警告,跟踪文件 #追加器 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=10M

这是我的
log4j.properties
文件

#设置记录器的级别
log4j.rootLogger=警告,跟踪文件
#追加器
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
#图案布局
log4j.appender.trace_file.layout=org.apache.log4j.patternalyout
log4j.appender.trace_file.layout.ConversionPattern=%d[%p](%F:%L)%m%n
#班级
log4j.logger.my_package=info,trace_文件
我想要的是:

  • 将来自
    my.package
    的日志请求至少以
    INFO
    级别存储在
    trace\u文件中
  • 仅当日志请求至少为
    WARN
    级别时,才将来自所有其他记录器的日志请求存储在
    trace\u文件中
我的配置不起作用。如果
my.package
引发级别为
WARN
的日志请求,则此日志请求将被写入两次。如果我使用两个独立的appender,就没有问题了

我缺少什么?

尝试从my_package logger语句中删除“trace_file”指令。

更改

log4j.logger.my_package=info, trace_file


默认情况下,附加程序是从父记录器继承的,因此,通过为根记录器和
my\u包
指定
trace\u file
,您可以告诉它执行两次

您缺少
rootLogger
的角色

通过根logguer
log4j.rootLogger=warn,trace_file
,然后由同一个附加程序通过
log4j.logger.my_package=info,trace_file
捕获来自
my_package
的警告

我想,当您创建第二个appender时,您没有将其指定给
根记录器
,是吗

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

log4j.logger.my_package=info

通过以下方式防止追加器可加性:

log4j.additivity.my_package=false

请参阅“附录和布局”一节

引述:

Appender可加性 记录器C的log语句的输出将发送到C中的所有追加器及其 祖先。这就是术语“附加可加性”的含义

但是,如果记录器C的祖先(例如p)的additivity标志设置为false,则 C的输出将被定向到C中的所有附加器及其祖先直到和 包括P,但不包括P的祖先中的附加语

默认情况下,记录器的可加性标志设置为true


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

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

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


最后,看看你以前是否从未听说过它

我同意Gevorg的观点。这可能是一个可加性问题

使用log4j.properties文件的用户:

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

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

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

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