2009-08-07 9 views
9

Nei miei log4j.properties ho:log4j dirige tutto l'output di log su stdout, anche se non dovrebbe

log4j.rootLogger=DEBUG,stdout 

log4j.logger.notRootLogger=DEBUG,somewhereelse 

L'appenders stdout e somewhereelse sono entrambi configurati correttamente, stdout scrive alla console e scrive somewhereelse a un file.

Nel mio codice in ogni classe o io impostare uno:

static Logger log = Logger.getLogger("notRootLogger); 

^Quando io non voglio roba in corso alla console.

OPPURE

static Logger log = Logger.getRootLogger(); 

^Quando faccio.

Cosa devo fare in log4.properties per interrompere le operazioni scritte su notRootLogger che terminano in stdout? Esiste un qualche tipo di ereditarietà dovunque il logger root scriva per andare avanti che deve essere disattivato in qualche modo?

Non voglio dover configurare un logger per ogni singola classe individualmente che voglio solo accedere alla console.

risposta

23

È necessario impostare additivity = false, IIRC. Dal log4j manual:

Ogni richiesta la registrazione attivata per un data logger sarà trasmessa a tutti i appenders in quella data logger e le appenders più alti nella gerarchia . In altre parole, gli appendici vengono ereditati in modo addizionale dalla gerarchia del logger . Ad esempio, se un appender della console viene aggiunto al logger root , tutte le richieste di registrazione registrate verranno stampate almeno sulla console . Se in aggiunta un file appender viene aggiunto a un logger, ad esempio C, , quindi abilitate le richieste di registrazione per C e i figli di C stamperanno su un file e sulla console. È possibile che sovrascriva questo comportamento predefinito in modo che l'accumulo dell'appender non sia più additivo impostando l'indicatore di additività su falso.

Prova questo:

log4j.rootLogger=DEBUG,stdout 
log4j.logger.notRootLogger=DEBUG,somewhereelse 
log4j.additivity.notRootLogger=false 
0

Hmm, avrebbe dovuto leggere la breve introduzione a Log4J più attentamente

log4j.additivity.notRootLogger=false 

correzioni, perché eredita appenders dai taglialegna sopra di esso nella gerarchia e il logger di root è ovviamente nella parte superiore della gerarchia.

+0

Cosa c'entra questo con l'ottimizzazione? – skaffman

+3

In che modo "ottimizzazione prematura"? Non è affatto un "ottimizzazione". Succede così che tu voglia un'opzione diversa da quella predefinita.Se l'impostazione predefinita fosse che l'additività fosse falsa, ciò significherebbe che un buon numero di altre persone avrebbe dovuto impostarlo esplicitamente su true. Sospetto che più persone lo desiderino "vero" che "falso". –

+0

l'aspettativa è abbastanza chiara se hai letto i documenti di intro log4j o se li hai usati –

0

Se le proprietà del programma di registrazione sono state definite nella classe java, è possibile chiamare il metodo logger.shutdown() alla fine, preferibilmente nel blocco finally per vietare la natura aggiuntiva del registratore.

Problemi correlati