2009-04-08 13 views
80

C'è un modo per configurare log4j in modo che emetta diversi livelli di registrazione per diversi appendici?Creazione di più file di registro di contenuto diverso con log4j

Sto provando a impostare più file di registro. Il file di log principale catturerebbe tutti i messaggi INFO e above per tutte le classi. (In fase di sviluppo, prenderebbe tutti i messaggi DEBUG e successivi e TRACE per classi specifiche.)

Quindi, vorrei avere un file di registro separato. Tale file di registro catturerebbe tutti i messaggi DEBUG per una serie specifica di classi e ignorerà tutti i messaggi per qualsiasi altra classe.

C'è un modo per ottenere ciò che cerco?

Grazie, Dan

+3

Vuoi dire che vuoi un file di registro per catturare DEBUG e solo DEBUG, un altro file di registro per catturare INFO e solo INFO, e così via? – Eddie

risposta

3

Il principale file di log/appender, istituito un .Threshold = INFO per limitare ciò che è effettivamente registrato nel appender per INFO e, soprattutto, a prescindere dal fatto che i taglialegna hanno DEBUG, TRACE, ecc , abilitato.

Per quanto riguarda la cattura di DEBUG e nulla oltre ... probabilmente dovresti scrivere un appender personalizzato.

Tuttavia io consiglierei di non fare questo, come suona come farebbe la risoluzione dei problemi e l'analisi piuttosto difficile:

  1. Se il vostro obiettivo è quello di avere un unico file dove si può guardare per risolvere qualcosa, allora spanning i tuoi dati di log su file diversi sarà fastidioso - a meno che tu non abbia una politica di registrazione molto irreggimentata, probabilmente avrai bisogno sia di DEBUG che di INFO di essere in grado di tracciare efficacemente l'esecuzione del codice problematico.
  2. Registrando ancora tutti i messaggi di debug, si perdono i guadagni di prestazioni che si ottengono in genere in un sistema di produzione disattivando la registrazione (modo).
+0

Avrei dovuto spiegare meglio il mio obiettivo. Il registro principale è per errori di tracciamento, condizioni insolite, ecc.in qualsiasi punto dell'app - questo registro deve essere tenuto piccolo, quindi viene eseguito regolarmente. Il log speciale tiene traccia del comportamento di un sottosistema e deve essere mantenuto per lunghi periodi di tempo. –

+0

Vuoi escludere i messaggi ERRORE, AVVISO, INFO dal secondo file di registro? –

+0

e in XML è possibile aggiungere il parametro Soglia in questo modo: razor

70

Questo dovrebbe iniziare:

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

Votati up, ma c'è un errore di battitura sulla linea 4 : log4j.appender.LoudAppender.Threshhold = INFO dovrebbe essere log4j.appender.QuierAppender.Threshhold = INFO, no? – Olivier

+0

Sì, penso sia giusto. Stavo solo leggendo dal doc e non ho provato prima;) – jasonnerothin

+0

alcuni editor? Abbiamo bisogno di alcuni editori? Daniel, potresti confermare la tua risposta di lavoro? – enguerran

26

Forse qualcosa di simile?

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

Pertanto, tutti i messaggi di informazioni vengono scritti su server.log; al contrario, foo.log contiene solo messaggi com.example.foo, inclusi i messaggi a livello di debug.

+0

È com.example.foo un pacchetto o una classe? – WowBow

+1

@WowBow potrebbe essere o, ma con un nome del genere sembra un pacchetto. usare i nomi di classe per i logger è solo una convenzione – araqnid

+0

Grazie. Ho provato entrambi dopo che ho chiesto e lavora per entrambi;) – WowBow

7

Ho avuto questa domanda, ma con una svolta: stavo cercando di registrare contenuti diversi in file diversi. Ho avuto informazioni per un registro di debug LowLevel e un registro utente HighLevel. Volevo che LowLevel andasse a un solo file e HighLevel andasse su un file e su un syslogd.

La mia soluzione era quella di configurare le 3 appenders, e quindi impostare la registrazione in questo modo:

log4j.threshold=ALL 
log4j.rootLogger=,LowLogger 

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

La parte che era difficile per me capire era che il 'log4j.logger' potrebbe avere più appenders elencati. Stavo cercando di farlo una riga alla volta.

Spero che questo aiuti qualcuno ad un certo punto!

Problemi correlati