log4j 的生产设置文件?

2022-09-03 04:16:53

这是我当前的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

更新*** 从我的所有线程添加线程转储示例 (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)

答案 1

Log4j 1.2 在生成嵌套日志记录时容易受到死锁的影响。toString()

看到旧的尚未解决的问题,如Log4J可以创建死锁条件(并发包捐赠)死锁与RollingFileAppender

它还在繁重的并发负载下存在性能终止锁同步问题。像Category callAppenders同步会导致java.lang.Thread.State:BLOCKEDMove org.apache.log4j.Category重新进入读/写锁定

即使是 AsyncAppender 也不是没有过多的锁:AsyncAppender.doAppend() 不需要同步1.2.15 中的 Deadlock 是由 AsyncAppender 和 ThrowableInformation 类引起的。还要小心 AsyncAppender 溢出

一个警告是始终将根类别级别限制为至少 INFO 或更高。这将防止日志记录调用获取上述问题中提到的不必要的锁。仅仅限制附加器阈值是不够的,因为稍后会考虑到这一点。请参阅使用发布/订阅类比的说明

要回答有关阈值如何与类别交互的问题,基本上可以将其视为发布/订阅。类别设置记录器发布的内容,阈值设置追加器的订阅级别。

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


答案 2

%F:%L 对性能有严重影响。虽然我不明白它们如何导致锁定,但我考虑在生产中省略它们。


推荐