2009-12-03 20 views
48

Tengo un registro de nivel INFO normal para la aplicación. Lo que necesito es registrar adicionalmente todos los eventos de nivel de ERROR para separar el registro de errores. Estoy utilizando la configuración de esta manera:Cómo configurar log4j para registrar diferentes niveles de registro en diferentes archivos para el mismo registrador

<logger name="com.acme"> 
    <level value="error"/> 
    <appender-ref ref="error"/> 
</logger> 

<logger name="com.acme"> 
    <level value="info"/> 
</logger> 

<root> 
    <level value="warn"/> 
    <appender-ref ref="general"/> 
</root> 

Esta configuración registra errores solamente. Si pongo el registrador de nivel de información primero, entonces se registrará solo en el apéndice general, pero el registrador de errores no funcionará. Me gustaría que ambos trabajen.

Respuesta

60

Lo que necesita hacer es tener una sola definición <logger> con un nivel definido de INFO, pero en sus dos definiciones de apéndice, establece sus umbrales en consecuencia, p.

<appender name="ERROR_FILE"> 
    <param name="Threshold" value="ERROR"/> 
</appender> 

<appender name="GENERAL"> 
    <param name="Threshold" value="INFO"/> 
</appender> 

A continuación, añadir tanto appenders a su registrador:

<logger name="com.acme"> 
    <level value="INFO"/> 
    <appender-ref ref="ERROR_FILE"/> 
    <appender-ref ref="GENERAL"/> 
</logger> 

entradas del registro de ahora ir al registrador le son enviadas a ambos appenders, pero ya que tienen diferentes umbrales independientes, el appender ERROR_FILE sólo se log ERROR y superior.

+0

@vilmonts Si define el mismo registrador (com.acme) dos veces, una de ellas se sobreescribe, y es por eso que no se puede ver el Mensajes INFO: el primero (con nivel de "error") borra el siguiente (con mensajes de "información"). –

+1

Gracias, skaffman. Me salvaste la vida. – vilmonts

+1

Pero quiero permitir que mi apilador ERROR_FILE reciba los mensajes de depuración seleccionados de otro registrador. – AmanicA

4

Es necesario utilizar filtros de log4j:

<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
    <param name="levelMin" value="ERROR" /> 
    <param name="levelMax" value="ERROR" /> 
</filter> 

De esta manera se pueden crear archivos de registro para cada nivel por separado.

+0

esta es una gran respuesta. Estoy usando archivos .properties para mi configuración log4j. ¿Podría incluir en su respuesta cómo voy a configurar este filtro en .properties? Por favor –

5

solución de trabajo completo incluyendo la fecha en el nombre del archivo:

<appender name="InfoFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
     <param name="levelMin" value="INFO" /> 
     <param name="levelMax" value="INFO" /> 
    </filter> 
</appender> 

<appender name="ErrorFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="Threshold" value="ERROR" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
</appender> 
<root> 
    <level value="INFO" /> 
    <appender-ref ref="InfoFileAppender" /> 
    <appender-ref ref="ErrorFileAppender" /> 
</root> 
Cuestiones relacionadas