2010-08-21 27 views
12

Aquí está mi archivo actual de configuración de log4j. ¿Son estas configuraciones ideales para el uso de producción o hay algo que deba eliminar/modificar o cambiar? Pregunto porque estaba colgando todos mis hilos debido al bloqueo de log4j. Revisé mis descriptores de archivos abiertos que sólo estaba usando 113.Archivo de configuración de producción para 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 

ACTUALIZACIÓN *** Adición de muestra de volcado de hilo de todos mis hilos (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) 

Respuesta

0

Esto se ve normal. No veo cómo esto solo podría causar el bloqueo de log4j. ¿Tal vez podría publicar un volcado de hilo de su problema?

1

% F:% L tiene un gran impacto en el rendimiento. Aunque no veo cómo podrían causar el bloqueo, consideraría omitirlos para la producción.

+0

De acuerdo. En su lugar, compila tu código con información de depuración y obtendrás los números de línea en los seguimientos de la pila cuando se produzcan errores. – AngerClown

2

¿Está creando un registrador para cada clase utilizando el estándar private static final Logger logger = Logger.getLogger(Foo.class); donde Foo es la clase en la que se declara el registrador? Si solo tiene 1 instancia de Logger en toda su aplicación, podría haber cierta controversia si hay una gran cantidad de registros.

1

Aparentemente, este tipo tenía un problema similar (link).
Es desconcertante por qué su aplicación se cuelga. ¿Están todos bloqueados en las clases log4j? Veo que al menos la que publicaste estaba escribiendo un registro "ERROR". Podría ser la causa?

¿Desea publicar el volcado completo?

28

Log4j 1.2 es vulnerable a deadlocks cuando toString() produce el registro anidado.

Vea problemas antiguos aún no resueltos como Log4J can create deadlock conditions (concurrent package donation) y Deadlock with RollingFileAppender.

También tiene problemas de sincronización de bloqueo que matan el rendimiento bajo una gran carga concurrente. Me gusta Category callAppenders synchronization causes java.lang.Thread.State: BLOCKED y Move org.apache.log4j.Category to reentrant read/write locks.

Incluso AsyncAppender no está libre de bloqueos excesivos: AsyncAppender.doAppend() does not need to be synchronized y Deadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes. También tenga cuidado con AsyncAppender overflow.

Una advertencia es siempre restringir el nivel de la categoría raíz al menos a INFO o superior. Esto evitaría que las llamadas de registro adquieran bloqueos innecesarios mencionados en los problemas anteriores. Solo limitar el umbral de apéndices no es suficiente ya que se tiene en cuenta más adelante. Ver explanation with publish/subscribe analogy:

Para responder a su pregunta acerca de cómo interactúa con umbral de categoría, básicamente piensan de la misma es como una publicación/suscripción. La categoría establece lo que publica el registrador, el umbral establece el nivel de suscripción del appender.

Las categorías anidadas de interés se pueden asignar individualmente a prioridades más bajas si es necesario.

+1

Excelente respuesta, gracias. – cs94njw

Cuestiones relacionadas