2010-08-21 8 views
12

Hier ist meine aktuelle Log4j Einstellungsdatei. Sind diese Einstellungen ideal für den Produktionseinsatz oder sollte ich etwas entfernen/verändern oder verändern? Ich frage, weil ich alle meine Threads wegen log4j blockieren aufgehängt bekam. Ich habe meine offene Dateideskriptoren ich nur mit 113.Produktionseinstellungsdatei für log4j?

# ***** 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 *** Hinzufügen von Thread-Dump Probe von allen meinen Fäden (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) 

Antwort

0

Das sieht normal. Ich sehe nicht, wie dies allein Log4j blockieren könnte. Vielleicht könnten Sie einen Thread-Dump Ihres Problems veröffentlichen?

1

% F:% L hat schwerwiegende Auswirkungen auf die Leistung. Obwohl ich nicht sehe, wie sie zu Sperren führen würden, würde ich überlegen, sie für die Produktion auszulassen.

+0

Einverstanden. Kompilieren Sie Ihren Code stattdessen mit Debuginformationen, und Sie erhalten die Zeilennummern in Stack-Traces, wenn Fehler auftreten. – AngerClown

2

Erstellen Sie für jede Klasse einen Logger mit dem Standard private static final Logger logger = Logger.getLogger(Foo.class);, wobei Foo die Klasse ist, in der der Logger deklariert wird? Wenn Sie nur eine Logger-Instanz in Ihrer gesamten Anwendung haben, kann es zu Konflikten kommen, wenn viel protokolliert wird.

1

Dieser Typ hatte anscheinend ein ähnliches Problem (link).
Es ist jedoch rätselhaft, warum Ihre App hängt. Werden sie alle in log4j-Klassen blockiert? Ich sehe, dass zumindest der, den du gepostet hast, ein "FEHLER" -Log geschrieben hat. Könnte das die Ursache sein?

Vielleicht möchten Sie den vollständigen Dump posten?

28

Log4j 1.2 ist anfällig für deadlocks, wenn toString() eine verschachtelte Protokollierung erzeugt.

Siehe alte im Alter noch ungelöste Probleme wie Log4J can create deadlock conditions (concurrent package donation) und Deadlock with RollingFileAppender.

Es hat auch Performance-Tötungs-Lock-Synchronisation Probleme unter hoher gleichzeitigen Belastung. Wie Category callAppenders synchronization causes java.lang.Thread.State: BLOCKED und Move org.apache.log4j.Category to reentrant read/write locks.

Auch AsyncAppender ist nicht frei von übermäßigen Sperren: AsyncAppender.doAppend() does not need to be synchronized und Deadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes. Achten Sie auch auf AsyncAppender overflow.

Eine Einschränkung besteht darin, die Stammkategorie mindestens auf INFO oder höher zu beschränken. Dies würde verhindern, dass Protokollierungsaufrufe unnötige Sperren erhalten, die in den obigen Punkten erwähnt sind. Eine Begrenzung der Appender-Schwelle ist nicht ausreichend, da sie später berücksichtigt wird. Siehe explanation with publish/subscribe analogy:

Um Ihre Frage zu beantworten, wie Schwelle interagiert mit der Kategorie, im Grunde halten sie für eine ist Publish/Subscribe. Die Kategorie setzt was vom Logger veröffentlicht wird, der Schwellenwert setzt die Subskription Ebene des Appenders.

Verschachtelte Interessenkategorien können bei Bedarf individuell mit niedrigeren Prioritäten versehen werden.

+1

Ausgezeichnete Antwort, danke. – cs94njw