2011-01-18 20 views
11

Hi normalmente in livelli di priorità Log4j sono i seguentiModificare il livello di priorità in Log4j

  • DEBUG < INFORMAZIONI < WARN < ERRORE FATALE <

possiamo cambiare questo i livelli di priorità. Il mio requisito è che devo registrare solo i dettagli che hanno il livello di priorità INFO e FATAL. I registri con livello di priorità DEBUG, WARN e ERROR non dovrebbero registrare. Se posso cambiare i livelli di priorità come

  • DEBUG < WARN < ERROR < INFORMAZIONI < FATAL

è possibile. O c'è un altro modo per farlo. Pls help ..

+0

Perché non si utilizza WARN e fatale o WARN ed ERRORE? Questo è in genere ciò che la maggior parte dei progetti che ho visto fare, e non devi cambiare il modo in cui funziona log4j e potenzialmente confondere le nuove persone che aderiscono al progetto. – jmort253

+0

No. Sto registrando tutti i livelli di messaggi. Ma nelle esecuzioni normali ho solo bisogno di registrare INFO e FATAL. Ci sarà l'occasione ho bisogno di eseguire il debug dell'applicazione. A quel tempo registrerò tutti i messaggi di 5 livelli. Spero di farlo cambiando il file di configurazione esterno (non quello usato per log4j) che cambia il livello di priorità del logger che sto usando. – nath

+0

Compiti ovunque? – gabuzo

risposta

26

Non ho mai avuto bisogno di farlo, ma dato che ho letto una volta Log4J - Il manuale completo, spero che questi suggerimenti aiuteranno.

  1. Scrivi la tua filtro personalizzato estendendo org.apache.log4j.spi.Filter
  2. Override decide method
  3. Usa loggingEvent.getLevel(), per identificare il livello di registro che è stato attivato.
  4. Scrivi seguente logica nel decidere

    if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL) 
        return ACCEPT; 
    return DENY; 
    

Questo filtro accetterà tutti i registri che sono o INFO o fatali. Potresti diventare più creativo.

Si prega di notare che non ho testato questo codice. Questa è solo una linea guida, spero che questo aiuta


Edit: su una ricerca po ', ho trovato qualcosa che potrebbe essere più facile. Credo che, è possibile utilizzare LevelMatchFilter, in questo modo

<filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="info" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="fatal" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

riferiscono: http://wiki.apache.org/logging-log4j/Log4jXmlFormat per configurarion XML. C'è una sezione sul Filter Configuration


Non so cosa si ferma OP ad accettare questa risposta. Ho appena testato, funziona:

Ecco l'XML.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="util" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="D:/util.log" /> 
    <param name="Append" value="true" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> 
    </layout>   

    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="info" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="fatal" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

    </appender> 

    <root> 
    <priority value ="debug" /> 
    <appender-ref ref="util" /> 
    </root> 


</log4j:configuration> 

Ecco il codice Java

DOMConfigurator.configure("log4j.xml"); 
    Logger log = Logger.getLogger(Test.class); 
    log.debug("DEBUG"); 
    log.info("INFO"); 
    log.warn("WARN"); 
    log.error("ERROR"); 
    log.fatal("FATAL"); 

Ecco l'output in (come configurato) D:/util.log

main INFO test.Test - INFO 
main FATAL test.Test - FATAL 
+0

Grazie amico. Funziona bene. Grazie mille. :) – nath

+0

@ganuke contento che abbia aiutato. – Nishant

0

Afaik, non è possibile modificare la precedenza di priorità in Log4j. Ma è possibile scrivere una propria implementazione logger, che registrerà informazioni necessarie solo:

  • scrivere il proprio LoggerFactory/Logger coppia
  • specificare LoggerFactory in log4j.properties di file:

    log4j.loggerFactory = com.mycompany.mypackage .MyLog4JLoggerFactory

  • nell'implementazione del Logger, ignorare qualsiasi cosa eccetto gli errori INFO e FATAL.

Tuttavia, sopra potrebbe non essere la soluzione migliore, perché è orientata verso 1.2.x. Forse le versioni più recenti di log4j (SLF4J) hanno modi più eleganti per realizzarlo.

0

È possibile ottenere ciò apportando alcune modifiche nel file log4j.properties.
Ad esempio il livello predefinito potrebbe essere FATAL e quindi è possibile specificare il pacchetto o una classe per il livello INFO.

log4j.rootLogger = FATAL, stdout, R

Normativa per i registri della confezione:
log4j.logger.com.xxx = INFO

Normativa per i registri di classe:
log4j.logger.com. xxx.util.EmailManager = INFO

Spero che questo aiuti.

+0

questo non farà quello che vuole. è necessario leggere la domanda completa – fmucar

+0

Capisco cosa sta chiedendo e la risposta che ho dato è la soluzione più semplice per registrare le dichiarazioni di registro FATAL e INFO. – JSS

Problemi correlati