生产设置文件为log4j?

这是我目前的log4j设置文件。 这些设置是生产使用的理想select还是我应该删除/调整或更改? 我问,因为我得到所有我的线程挂起由于log4j阻塞。 我检查了我打开的文件描述符,我只用了113。

# ***** Set root logger level to WARN and its two appenders to stdout and R. log4j.rootLogger=warn, stdout, R # ***** stdout is set to be a ConsoleAppender. log4j.appender.stdout=org.apache.log4j.ConsoleAppender # ***** stdout uses PatternLayout. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # ***** Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n # ***** R is set to be a RollingFileAppender. log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=logs/myapp.log # ***** Max file size is set to 100KB log4j.appender.R.MaxFileSize=102400KB # ***** Keep one backup file log4j.appender.R.MaxBackupIndex=5 # ***** R uses PatternLayout. log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %d %c - %m%n #set httpclient debug levels log4j.logger.org.apache.component=ERROR,stdout log4j.logger.httpclient.wire=ERROR,stdout log4j.logger.org.apache.commons.httpclient=ERROR,stdout log4j.logger.org.apache.http.client.protocol=ERROR,stdout 

更新***从我的所有线程添加线程转储示例(100)

 "pool-1-thread-5" - Thread t@25 java.lang.Thread.State: BLOCKED on org.apache.log4j.spi.RootLogger@1d45a585 owned by: pool-1-thread-35 at org.apache.log4j.Category.callAppenders(Category.java:201) at org.apache.log4j.Category.forcedLog(Category.java:388) at org.apache.log4j.Category.error(Category.java:302) 

toString()产生嵌套日志logging时,Log4j 1.2容易出现死锁 。

看到像Log4J这样的老年仍然未解决的问题可以创build死锁条件(并 发包 捐赠)和RollingFileAppender死锁 。

在并发负载较重的情况下,它也具有性能查杀锁同步问题。 类似于callAppenders同步会导致java.lang.Thread.State:BLOCKED并且移动org.apache.log4j.Category来重入读/写锁 。

即使AsyncAppender也没有过多的locking: AsyncAppender.doAppend()不需要 在AsyncAppender和ThrowableInformation类所引起的1.2.15中 同步和死锁 。 也要注意AsyncAppender溢出 。

一个警告是总是限制根类别级别至lessINFO或更高。 这将防止日志logging调用获取上述问题中提到的不必要的锁。 只是限制appender阈值是不够的,因为它后来被考虑在内。 参见发布/订阅类比的解释 :

要回答你关于如何与门类交互的问题,基本上认为它是一个发布/订阅。 类别设置logging器发布的内容,阈值设置appender的订阅级别。

如果需要,嵌套的感兴趣的类别可以单独给予较低的优先级。

你是使用标准的private static final Logger logger = Logger.getLogger(Foo.class);创build每个类的private static final Logger logger = Logger.getLogger(Foo.class); Foo是在哪个类中声明的logging器? 如果您的整个应用程序中只有一个Logger实例,那么如果有大量日志logging,则可能会有一些争用。

%F:%L有严重的性能影响。 虽然我不明白他们是如何造成locking的,但是我会考虑省去他们的生产。

这家伙显然有类似的问题( 链接 )。
虽然为什么你的应用程序挂起,这是令人费解的。 他们都被阻止在log4j类? 我发现至less你发布的是写一个“错误”日志。 这可能是原因吗?

也许你想发布完整的转储?

这看起来很正常。 我不明白这是如何单独可能会导致log4j阻塞。 也许你可以发布你的问题的线程转储?