2010-08-21 30 views
12

這是我目前的log4j設置文件。這些設置適合生產使用還是應該刪除/調整或更改?我問,因爲我因爲log4j阻塞而讓所有線程掛起。我檢查了我打開的文件描述符我只用113log4j的生產設置文件?

# ***** 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 [email protected] 
    java.lang.Thread.State: BLOCKED on [email protected] 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

這看起來很正常。我沒有看到這會如何導致log4j阻塞。也許你可以發佈你的問題的線程轉儲?

1

%F:%L有嚴重的性能影響。雖然我不明白他們會如何造成鎖定,但我會考慮將它們省略以進行生產。

+0

同意。相反,用調試信息編譯你的代碼,當發生錯誤時你會得到堆棧跟蹤中的行號。 – AngerClown 2010-08-21 18:34:34

2

您是否正在使用標準private static final Logger logger = Logger.getLogger(Foo.class);創建每個類的記錄器,其中Foo是聲明記錄器的類?如果您的整個應用程序中只有一個Logger實例,那麼如果有很多日誌記錄,則可能會有一些爭用。

1

這傢伙顯然有類似的問題(link)。
雖然爲什麼你的應用掛起,這是令人費解的。他們都被log4j類阻塞了嗎?我看到至少你發佈的那個人正在寫一個「錯誤」日誌。這可能是原因嗎?

也許你想發佈完整轉儲?

28

toString()產生嵌套日誌時,Log4j 1.2容易受到deadlocks的影響。

查看老年人尚未解決的問題,例如Log4J can create deadlock conditions (concurrent package donation)Deadlock with RollingFileAppender

它在嚴重的併發負載下也具有性能查殺鎖同步問題。 Like Category callAppenders synchronization causes java.lang.Thread.State: BLOCKEDMove org.apache.log4j.Category to reentrant read/write locks

即使是AsyncAppender也不是沒有過度的鎖: AsyncAppender.doAppend() does not need to be synchronizedDeadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes。同時謹防AsyncAppender overflow

一個警告是總是限制根類別級別至少INFO或更高。這將防止日誌記錄調用獲取上述問題中提到的不必要的鎖。只是限制appender閾值是不夠的,因爲它後面會考慮到。見explanation with publish/subscribe analogy

要獲得關於如何門檻與類交互問題, 基本上認爲它是作爲一個發佈/訂閱。類別設置 由記錄器發佈的內容,閾值設置訂閱 級別的appender。

如果需要,可以單獨給出嵌套的感興趣的類別。

+1

優秀的答案,謝謝。 – cs94njw 2013-02-05 11:18:25