2012-06-21 18 views
15

Ho utilizzato SLF4j come framework di registrazione, supportato da log4j. Il mio problema è che sto cercando un modo per modificare il livello di registrazione per il mio logger in fase di runtime.Come modificare il livello slf4j in fase di esecuzione?

Capisco che slf4j non lo consenta direttamente tramite la propria API e, quindi, devo accedere direttamente al provider di registrazione. Personalmente, trovo che questa sia un'enorme mancanza di slf4j. Quindi ora la mia domanda è come posso determinare in modo programmatico tramite slf4j quale fornitore sto usando? Lo scopo principale dell'uso di slf4j è quello di diventare indipendenti dal punto di vista del fornitore: puoi facilmente passare dal tuo sistema di registrazione preferito senza dover ricodificare nulla. Ma ora, se devo fare chiamate dirette a log4j, sto perdendo questa capacità.

Per lo meno, vorrei essere in grado di determinare se sto utilizzando log4j come provider e in tal caso, quindi consentire all'utente di cambiare i livelli di registro.

Se faccio LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME), il risultato è un esempio di org.slf4j.impl.Log4jLoggerAdapter e nemmeno org.apache.log4j.Logger (come avrei sperato/attesa).

C'è un modo per scoprirlo?

Grazie, Eric

+1

Vedere: [Come trovare la libreria su cui si è associata la libreria slf4j?] (Http://stackoverflow.com/questions/10505418) –

+0

Grazie. Non sono sicuro del motivo per cui l'ho perso nella mia ricerca originale. –

risposta

13

SLF4J è stato progettato come un'astrazione per librerie, non le applicazioni (naturalmente, si può e si deve ancora usare SLF4J nelle chiamate di registrazione del proprio app, per coerenza). Nella propria app, si sceglie il framework del logger sottostante, quindi è bene accedere all'API log4j nelle parti specifiche del logging-config.

In nessun modo è necessario spostare una libreria con la modifica della configurazione di registrazione, IMHO, quindi non è opportuno che sia nell'API SLF4J.

+3

Abbastanza corretto, se SLF4J è utilizzato esclusivamente per le librerie. Tuttavia, mi sembra che anche qualcosa di così flessibile in una libreria debba essere disponibile nella tua applicazione. Il concetto di avere una singola API a cui posso collegare qualsiasi framework di registrazione è fantastico. Inoltre, il più delle volte parte della tua applicazione finisce per essere refactored in una libreria ad un certo punto. Non è opportuno avere la necessità di ricodificare qualsiasi riferimento a log4j per diventare slf4j. Se SL4j è stato progettato solo per le librerie (che non ho letto sul sito slf4j), trovo che miope. –

+3

Siamo spiacenti, non ha chiarito: dovresti assolutamente usare SLF4J per le chiamate di registrazione della tua app. Ma nella piccola sezione del tuo codice che riguarda la modifica della configurazione di logging, basta trasmettere le cose alle classi Log4J. Se decidi di cambiare le implementazioni di registrazione, dovresti comunque riscrivere quel bit. – artbristol

+0

concordato. Stavo solo cercando di fare tutto genericamente. Immagino che non sia fattibile. Non è nemmeno una questione di casting - Devo fare le chiamate usando direttamente le classi Log4j (es: usa log4j.Logger invece di slf4j.LoggerFactory per recuperare i logger) –

Problemi correlati