2009-04-08 21 views
80

¿Hay alguna manera de configurar log4j para que muestre diferentes niveles de registro en diferentes appenders?Creación de varios archivos de registro de diferente contenido con log4j

Estoy tratando de configurar varios archivos de registro. El archivo de registro principal captará todos los mensajes INFO y anteriores para todas las clases. (En desarrollo, captaría todos los mensajes DEBUG y anteriores, y TRACE para clases específicas.)

Luego, me gustaría tener un archivo de registro por separado. Ese archivo de registro capturaría todos los mensajes DEBUG para un subconjunto específico de clases, e ignoraría todos los mensajes de cualquier otra clase.

¿Hay alguna manera de obtener lo que busco?

Gracias, Dan

+3

¿Quiere decir que quiere un archivo de registro para capturar DEBUG y solo DEPURAR, otro archivo de registro para capturar INFO y solo INFO, y así sucesivamente? – Eddie

Respuesta

3

Para el principal archivo de registro/appender, establecieron un .Threshold = INFO para limitar lo que realmente se registra en el appender a INFO y superior, independientemente de si o no los registradores tienen DEBUG, TRACE, etc. , habilitado

En cuanto a atrapar DEBUG y nada por encima de eso ... es probable que tenga que escribir un appender personalizado.

Sin embargo, me gustaría recomendar no hacer esto, ya que suena como que haría que la solución de problemas y análisis bastante duro:

  1. Si su objetivo es tener un único archivo en el que puede mirar a solucionar algo, entonces expandir sus datos de registro a través de diferentes archivos será molesto; a menos que tenga una política de registro muy reglamentada, es probable que necesite contenido tanto de DEPURADOR como de INFORMACIÓN para poder rastrear la ejecución del código problemático de manera efectiva.
  2. Al seguir registrando todos sus mensajes de depuración, está perdiendo las ganancias de rendimiento que generalmente obtiene en un sistema de producción al bajar el registro (método).
+0

Debería haber explicado mi objetivo mejor. El registro principal es para el seguimiento de errores, condiciones inusuales, etc.en cualquier lugar de la aplicación: se requiere que este registro se mantenga pequeño, por lo que se transfiere regularmente. El registro especial rastrea el comportamiento de un subsistema y debe mantenerse durante largos períodos de tiempo. –

+0

¿Desea excluir los mensajes de ERROR, WARN, INFO del segundo archivo de registro? –

+0

y en XML puede agregar el parámetro Umbral de la siguiente manera: razor

70

Esto debería empezar:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE 
# setup A1 
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.QuietAppender.Threshold=INFO 
log4j.appender.QuietAppender.File=quiet.log 
... 


# setup A2 
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.LoudAppender.Threshold=DEBUG 
log4j.appender.LoudAppender.File=loud.log 
... 

log4j.logger.com.yourpackage.yourclazz=TRACE 
+6

votado hasta, pero no es un error tipográfico en la línea 4 : log4j.appender.LoudAppender.Threshhold = INFO debe ser log4j.appender.QuierAppender.Threshhold = INFO, ¿no? – Olivier

+0

Sí, creo que es correcto. Estaba leyendo el documento y no lo hice primero;) – jasonnerothin

+0

algunos editores? Necesitamos algunos editores? Daniel, ¿podría validar su respuesta de trabajo? – enguerran

26

Tal vez algo como esto?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
<!-- general application log --> 
<appender name="MainLogFile" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="server.log" /> 
    <param name="Threshold" value="INFO" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/> 
    </layout> 
</appender> 
<!-- additional fooSystem logging --> 
<appender name="FooLogFile" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="foo.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/> 
    </layout> 
</appender> 
<!-- foo logging --> 
<logger name="com.example.foo"> 
    <level value="DEBUG"/> 
    <appender-ref ref="FooLogFile"/> 
</logger> 
<!-- default logging --> 
<root> 
    <level value="INFO"/> 
    <appender-ref ref="MainLogFile"/> 
</root> 
</log4j:configuration> 

Por lo tanto, todos los mensajes de información se escriben en server.log; por el contrario, foo.log contiene solo mensajes com.example.foo, incluidos los mensajes de nivel de depuración.

+0

¿Es com.example.foo un paquete o una clase? – WowBow

+1

@WowBow podría ser cualquiera, pero con un nombre así parece un paquete. usar nombres de clase para registradores es solo una convención – araqnid

+0

Gracias. Intenté ambos después de que pregunté y trabajo para ambos;) – WowBow

7

Tuve esta pregunta, pero con un giro: estaba intentando registrar diferentes contenidos en diferentes archivos. Tenía información para un registro de depuración de LowLevel y un registro de usuario de HighLevel. Quería que LowLevel fuera solo a un archivo y HighLevel a un archivo y a un syslogd.

Mi solución fue para configurar los 3 appenders, y luego configurar el registro de la siguiente manera:

log4j.threshold=ALL 
log4j.rootLogger=,LowLogger 

log4j.logger.HighLevel=ALL,Syslog,HighLogger 
log4j.additivity.HighLevel=false 

La parte que era difícil para mí averiguar fue que el 'log4j.logger' podría tener múltiples appenders listado. Intentaba hacerlo una línea a la vez.

Espero que esto ayude a alguien en algún momento!

Cuestiones relacionadas