log4jlogging两次

我正在使用log4j来logging错误和其他系统信息。 但在INFO级别logging了两次信息。

public static void main(final String... args) throws Exception { LOGGER.info("program started"); try { // try body codes } catch (Exception ex) { LOGGER.info("program start-up failed.",ex); } } 

然而,当程序启动或失败的信息logging两次,任何人都可以帮助我find可能的原因。

看起来好像您的消息正在被根logging器logging一次,并且由特定的logging器logging,因为您可能已经configuration了这两个appender(可能位于不同的位置 – 属性文件中,然后是代码中)。

这可以通过在logging器上设置可加性来解决。 Log4j 手册在Appenders和Layout部分提到了可加性。请检查一下

同意亚特兰蒂斯。

 log4j.rootCategory=INFO, console log4j.logger.org.hibernate=INFO 

上述属性设置会导致双重logging。

但是增加

 log4j.additivity.org.hibernate=false 

解决了这个问题。

看看这本书的第62页。 http://books.google.com/books?id=hZBimlxiyAcC&printsec=frontcover#v=onepage&q&f=false

对于那些使用XML格式的人:

 <logger name="package.class" additivity="false"> <level value="info" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </logger> 

注意:默认情况下,logging器将其可加性标志设置为true。

只需简单地添加

 logger.setadditivity(false); 

到你的代码( 参考 )。

在控制台中我们有双重结果,这是因为appender不是单身人士,而是添加剂。 意思是,一个类别从它的祖先inheritance所有的appender(默认情况下)。 如果我们添加一个appender到一个类别,并且写入与其他appender相同的底层stream(控制台,相同的文件等),相同的日志消息将在日志中出现两次(或更多)。 另外,如果层次结构中的两个类别configuration为使用相同的appender名称,则Log4j将向该appender写入两次。 为该类别configuration

如果您可以使用Javadebugging器运行该程序,请在其中发生这些双重日志logging调用之一的程序中放置一个断点。

检查debugging器中的logging器对象。 如果它是一个org.apache.log4j.Logger(v 1.2.x),那么它可能有一个AppenderAttachableImpl。 您可以查询appender列表的AppenderAttachableImpl。

如果您发现超过1个appender,这可能是问题 – 并解决它的一个线索。

调整可additivity属性的一个可能的select是从最具体到最通用的方面检查你的logging器。 在下面的例子中,我们期望在控制台中看到foo.bar.LoggingExampleClass中发生的任何日志事件的双重logging。 从foo.bar.LoggingExampleClasslogging器中删除额外的控制台appender是安全的,因为它已经被Rootlogging器覆盖了。

 <Logger name="foo.bar.LoggingExampleClass" level="DEBUG"> <AppenderRef ref="Console" /> <!-- THIS APPENDER COULD BE REMOVED --> <AppenderRef ref="FooBarPackageLogging" /> </Logger> <Root level="WARN"> <AppenderRef ref="Console" /> <AppenderRef ref="MainLogFile" /> </Root> 

对可加性调整方法和appender调整方法都有权衡。 closures叠加性可能会不经意地停止使用所需的通用级logging器的appender。 在上面的示例中,在foo.bar.LoggingExampleClass Logger上设置additivity="false"属性意味着日志logging事件不会追加到Rootlogging器中引用的MainLogFile。

另一方面,如果在不考虑对更细粒度的logging器的影响的情况下改变父控制器,则依赖于父控制器可能是有问题的。 例如,假设需要将foo.bar.LoggingExampleClasslogging事件写入控制台。 他们目前在上面的示例configuration由于可加性,即使foo.bar.LoggingExampleClasslogging器的控制台appender被删除。 但是,如果控制台appender在没有任何其他调整的情况下也从Root Logger中移除,则不再需要满足此要求。