2012-08-23 9 views
5

Se i miei log4j.properties guarda questoCome ottenere logger distinti in log4j?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

C'è un modo facile per ottenere solo i taglialegna com.foo, com.foo.Bar, root e org.springframework. E non le classi specifiche che sono state create ed ereditano i livelli (IE com.foo.bar.Baz?
Per i miei scopi voglio creare una pagina di amministrazione che mostri questi logger e i loro livelli, ma non TUTTI i logger, solo quelli che sono stati configurati direttamente tramite proprietà. attualmente sto attraversando la gerarchia madre fino a quando non mi imbatto in un logger che ha un livello diverso da quello principale, ma che può nascondere alcuni logger configurati se sono nella gerarchia e impostano lo stesso livello di qualcosa più in alto.

+1

L'analisi del file delle proprietà è fuori questione? –

+0

No, utilizzando log4j in modo programmatico per scoprire quali logger sono stati configurati e non si tratta solo di ereditare da altri logger. – Kodi

risposta

4

Si potrebbe fare qualcosa di simile prima ottenere tutti i logger dal gestore di registro:.

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

allora si può chiedere ogni logger per il suo livello:

Level currentLevel = logger.getLevel(); 

currentLevel sarà null se non è mai stato impostato in modo esplicito. Quindi, se il logger era impostato su un livello specifico in log4j.properties, si otterrà un valore non nullo. Altrimenti riceverai il valore null. Il logger root riporta sempre un livello, quindi sarebbe un caso speciale. In questo modo, non è necessario analizzare il file log4j.properties.

L'unico problema è che se da qualche parte nel codice si invoca setLevel() su un registratore, esso segnalerà anche non nullo e verrà visualizzato nell'elenco. Questo perché log4j non sa come è stato impostato il livello, solo se è stato impostato. Per distinguere questi due casi, sarà comunque necessario analizzare log4j.properties.

Inoltre, tenere presente che questo funziona solo su logger che sono attualmente caricati. Quindi, se com.foo.Bar non è mai stato caricato, non lo vedrai nell'elenco, anche se è esplicitamente menzionato in log4j.properties. Log4J non sa di logger non esistenti che potrebbero essere creati in futuro. Ancora una volta, per questo è necessario analizzare log4j.properties.

+4

Non c'è getCurrentLoggers() in LogManager. Log4j 2.2. –

+1

@MagnoC Giusto, la mia risposta si riferisce a [Log4J v1] (https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html). Log4J v2 mancava ancora due anni al momento della risposta (pubblicato nel 2014). –

+0

Ok. Mi sto solo lamentando ... Ho bisogno di avvolgere Log4J nella mia classe Logger (per conservare i nomi ho bisogno di rimuovere Log4J JARs e creare le mie classi con gli stessi nomi) e aggiungere nuovamente LogAR JAR. Così chiamo real logger dalla mia classe Logger (usando il nome completo della classe). Ora posso abilitare e disabilitare il mio registratore. Quando disabilitato, non passo la stringa di registro attraverso il registro reale. –

Problemi correlati