2010-03-16 11 views
5

Ho una configurazione di log4J in cui si suppone che il logger di root registri i messaggi di livello ERROR e superiori alla console e un altro logger registri tutto su syslog.log4j rootLogger sembra ereditare il livello di registro di un altro registratore. Perché?

log4j.properties è:

# Root logger option 
log4j.rootLogger=ERROR,R 

log4j.appender.R=org.apache.log4j.ConsoleAppender 
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n 

log4j.logger.SGSearch=DEBUG,SGSearch 
log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender 
log4j.appender.SGSearch.SyslogHost=localhost 
log4j.appender.SGSearch.Facility=LOCAL6 
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout 
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n 

Nel codice che fanno

private static final Logger logger = Logger.getLogger("SGSearch"); 
. 
. 
. 
logger.info("Commencing snapshot index [" + args[1] + " -> " + args[2] + "]"); 

Quello che sta accadendo è che ho la registrazione della console per tutti i livelli di registrazione. Quello che sembra accadere è che il livello di SGSearch prevale in qualche modo sul livello impostato per il logger root. Non riesco a capirlo.

mi hanno confermato che Log4J sta leggendo le proprietà del file penso che sia, e nessun altro (tramite l'opzione -Dlog4j.debug)

+0

Ho riscontrato questo stesso problema/confusione. Vedi http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-according-to-event-level. –

risposta

13

Il modo in cui il concatenamento di Log4j funziona è leggermente controintuitivo (almeno per me). Vedi the log4j manual. Se il livello di richiesta è uguale o superiore alla soglia del logger di corrispondenza più specifico, viene accettato. Una volta accettata, la richiesta viene gestita dall'intera catena di antenati indipendentemente dalle loro soglie!

per sopprimere il comportamento concatenamento, aggiungere:

log4j.additivity.SGSearch=false 

Questo farà sì che le richieste gestite dal logger SGSearch essere più superato la catena.

Un altro suggerimento: non nominare lo stesso logger e appender, perché ad un certo punto in futuro tu o un collega li mescolerai. Il nome del logger dovrebbe indicare quale tipo di registrazione è gestito, il nome dell'appender dovrebbe specificare dove va la registrazione. Quindi in questo caso penserei che "SGSearch" potrebbe essere il nome del logger e l'appender dovrebbe essere chiamato qualcosa come "LocalSysLog".

BTW: Secondo me si sta facendo la cosa giusta limitando il logger root con una soglia alta e abbassandolo per logger specifici.Ciò evita la confusione da librerie rumorose (Apache ne ha alcuni noti).

+1

Mi sorprende che Log4j non applichi la soglia di eventi del log dei logger principali (dove il logger root è il genitore più in alto) indipendentemente dai loro logger figli. –

+0

Grazie! La tua risposta è stata molto utile. Mi riferisco alla tua risposta nella mia risposta a http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-according-to-event-level/3024279#3024279 al mio domanda simile a http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-according-to-event-level. –

+1

"Una volta accettata la richiesta, viene gestita dalla catena completa di antenati indipendentemente dalle loro soglie!" Se questo è vero, allora non si tratta di un bug in Log4j? Il comportamento che è così controintuitivo deve essere un errore. –

5

informazioni veloci su livelli

Log4J Livelli

Ai logger possono essere assegnati livelli. L'insieme di livelli possibili , DEBUG, INFO, WARN, ERROR e FATAL sono definiti nella classe org.apache.log4j.Level .

Se un determinato strumento non viene assegnato un livello , allora eredita una dalla sua più vicino antenato con un livello assegnato.

Il logger root risiede nella parte superiore di della gerarchia del logger. Esiste sempre e ha sempre un livello assegnato.

Ho cambiato la configurazione log4j esempio per lavorare in questo modo:

# Root logger option 
log4j.rootLogger=ALL,R 

log4j.appender.R=org.apache.log4j.ConsoleAppender 
log4j.appender.R.Target=System.out 
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n 
log4j.appender.R.Threshold=ERROR 

log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender 
log4j.appender.SGSearch.SyslogHost=localhost 
log4j.appender.SGSearch.Facility=LOCAL6 
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout 
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n 
log4j.appender.SGSearch.Threshold=DEBUG 

Spero che questo ti aiuta.

+0

Grazie. Ha funzionato, ma ho scoperto che avevo bisogno di aggiungere la riga "log4j.logger.SGSearch = ALL, SGSearch" e anche l'esempio che hai fornito. – AndrewR

+0

@AndrewR: O avresti potuto fare questo 'log4j.appender.SGSearch.Threshold = ALL', ma questo renderebbe' log4j.rootLogger' inutile (se non sbaglio). –

+0

Penso che questa soluzione non sia ottimale. Vedi il mio suggerimento qui sotto. –

Problemi correlati