Creación de varios archivos de registro de diferente contenido con log4j

81

¿Hay alguna forma de configurar log4j para que genere diferentes niveles de registro a diferentes appenders?

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

Entonces, me gustaría tener un archivo de registro 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 conseguir lo que busco?

Gracias Dan


fuente
3
¿Quiere decir que desea un archivo de registro para capturar DEBUG y solo DEBUG, otro archivo de registro para capturar INFO y solo INFO, y así sucesivamente?
Eddie

Respuestas:

70

Esto debería ayudarte 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
Jasonnerothin
fuente
3
¿Qué hace la última línea?
djangofan
1
@djangofan configura un nivel de registro de clase / paquete personalizado (es decir, com.yourpackage.yourclazz con registro de TRACE), aunque en este caso ya era el predeterminado (configurado en la línea 1), por lo que no hace nada. En mi opinión, este ejemplo sería mejor si rootLogger tuviera INFO y "yourclass" tuviera DEBUG.
Tom Clift
Los parámetros de la primera línea deben ser TRACE, QuietAppender, LoudAppender no QuietAppender, LoudAppender, TRACE
Richard Whitehead
26

¿Quizás 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.

arácnido
fuente
¿Es com.example.foo un paquete o una clase?
WowBow
1
@WowBow podría ser cualquiera, pero con un nombre como ese parece un paquete. el uso de nombres de clases para registradores es solo una convención
araqnid
Gracias.
Probé
7

Tenía esta pregunta, pero con un giro: estaba tratando de registrar contenido diferente en archivos diferentes. Tenía información para un registro de depuración de bajo nivel y un registro de usuario de alto nivel. Quería que LowLevel vaya a un solo archivo y HighLevel a un archivo y a un syslogd.

Mi solución fue configurar los 3 appenders y luego configurar el registro de esta manera:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

La parte que me resultó difícil de entender fue que 'log4j.logger' podría tener varios appenders listados. Intentaba hacerlo una línea a la vez.

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

Kieveli
fuente
3

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

En cuanto a la captura de DEBUG y nada más ... probablemente tendrías que escribir un appender personalizado.

Sin embargo, recomendaría no hacer esto, ya que parece que dificultaría bastante la resolución de problemas y el análisis:

  1. Si su objetivo es tener un solo archivo donde pueda buscar solucionar algún problema, entonces distribuir sus datos de registro en diferentes archivos será molesto, a menos que tenga una política de registro muy reglamentada, es probable que necesite contenido de DEBUG e INFO para Ser capaz de 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 normalmente obtiene en un sistema de producción al bajar el registro (modo).
mate b
fuente
Debería haber explicado mejor mi objetivo. El registro principal es para rastrear errores, condiciones inusuales, etc. en cualquier lugar de la aplicación; este registro debe mantenerse pequeño, por lo que se renueva regularmente. El registro especial rastrea el comportamiento de un subsistema y debe mantenerse durante largos períodos de tiempo.
¿Desea excluir los mensajes ERROR, WARN, INFO del segundo archivo de registro?
Matt b
y en XML puede agregar el parámetro Threshold como este: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </appender>
razor