这是我当前的log4j设置文件。这些设置是否适合生产使用,还是应该删除/调整或更改?我问,因为我的所有线程都因为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
UPDATE *** 从我的所有线程添加线程转储样本(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)
答案 0 :(得分:31)
当toString()
生成嵌套日志记录时,Log4j 1.2容易受deadlocks攻击。
查看旧的尚未解决的问题,例如Log4J can create deadlock conditions (concurrent package donation)和Deadlock with RollingFileAppender。
在繁重的并发负载下,它还具有性能消除锁同步问题。 与Category callAppenders synchronization causes java.lang.Thread.State: BLOCKED和Move org.apache.log4j.Category to reentrant read/write locks一样。
即使AsyncAppender也没有过多的锁定: AsyncAppender.doAppend() does not need to be synchronized和Deadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes。还要注意AsyncAppender overflow。
一个警告是始终将根类别级别限制为至少INFO或更高。这样可以防止日志记录调用获取上述问题中提到的不必要的锁。仅仅限制appender阈值是不够的,因为稍后会考虑它。见explanation with publish/subscribe analogy:
要回答有关阈值如何与类别互动的问题, 基本上认为它是一个发布/订阅。类别集 记录器发布的内容,阈值设置订阅 appender的水平。
如果需要,嵌套的兴趣类别可以单独给予较低的优先级。
答案 1 :(得分:2)
您是否使用标准private static final Logger logger = Logger.getLogger(Foo.class);
为每个类创建一个Logger,其中Foo是声明记录器的类?如果您的整个应用程序中只有1个Logger实例,那么如果有大量的日志记录,可能会有一些争用。
答案 2 :(得分:1)
%F:%L具有严重的性能影响。虽然我不知道它们是如何导致锁定的,但我会考虑将它们省略用于生产。
答案 3 :(得分:0)
这看起来很正常。我不明白这是如何导致log4j阻塞的。也许你可以发布你的问题的线程转储?