2009-12-03 2 views
48

Ho un normale registro del livello INFO per l'applicazione. Ciò di cui ho bisogno è di registrare anche tutti gli eventi di livello ERROR per separare il log degli errori. Sto usando una configurazione come questa:Come configurare log4j per registrare diversi livelli di registro in file diversi per lo stesso registratore

<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> 

Questa configurazione registra solo gli errori. Se metto per primo il logger del livello informazioni, esso accederà solo all'appender generale, ma il logger degli errori non funzionerà. Mi piacerebbe che funzionassero entrambi.

risposta

60

Quello che devi fare è avere una singola definizione <logger> con un livello definito di INFO, ma nelle tue due definizioni di appender, ne imposti le soglie di conseguenza, ad es.

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

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

È quindi aggiungere entrambi appenders al tuo logger:

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

voci del registro ora di andare al logger andranno inviati a entrambe le appenders, ma poiché hanno diverse soglie indipendenti, l'appender ERROR_FILE solo la volontà log ERROR e sopra.

+0

@vilmonts Se si definisce lo stesso logger (com.acme) due volte, uno di loro viene sovrascritto, e per questo non si può vedere la Messaggi INFO: il primo (con livello "errore") cancella il successivo (con messaggi "info"). –

+1

Grazie, skaffman. Mi hai salvato la vita. – vilmonts

+1

Ma voglio consentire al mio appender ERROR_FILE di ricevere i messaggi di debug selezionati di qualche altro logger ?! – AmanicA

4

è necessario utilizzare filtri log4j:

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

questo modo è possibile creare file di log per ogni livello separatamente.

+0

questa è un'ottima risposta. sto usando i file .properties per la mia configurazione di log4j. Potresti includere nella tua risposta come farei per configurare questo filtro in .properties? per favore –

5

soluzione di lavoro completa con la data nel nome del file:

<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>