2016-02-10 19 views
12

sto usando il modulo di registrazione di Python, e vorrei disattivare i messaggi di log stampati dai moduli di terze parti che ho importare. Per esempio, io sto usando qualcosa come il seguente: ("! Il mio messaggio")Python Logging - Disabilitare la registrazione da moduli importati

logger = logging.getLogger() 
logger.setLevel(level=logging.DEBUG) 
fh = logging.StreamHandler() 
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s') 
fh.setFormatter(fh_formatter) 
logger.addHandler(fh) 

Questo stampa i miei messaggi di debug quando faccio una logger.debug, ma stampa anche i messaggi di debug da qualsiasi modulo I importazione (come richieste e un numero di altre cose).

mi piacerebbe vedere solo i messaggi di log da moduli mi interessa. E 'possibile fare il modulo di registrazione fare questo?

Idealmente, mi piacerebbe essere in grado dire il registratore per stampare i messaggi da "MODULEX, ModuleY" e ignorare tutti gli altri.

Ho guardato la segue, ma io non voglio avere a disabilitare/abilitare la registrazione prima di ogni chiamata a una funzione importata: logging - how to ignore imported module logs?

risposta

14

Il problema è che chiamando getLogger senza argomenti restituisce la radice logger quindi quando si imposta il livello su logging.DEBUG si sta impostando anche l'impostazione del livello per altri moduli che utilizzano quel logger.

È possibile risolvere questo semplicemente non utilizzando il programma di registrazione principale. Per fare questo basta passare un nome come argomento, ad esempio il nome del modulo:

logger = logging.getLogger('my_module_name') 
# as before 

questo creerà un nuovo logger e quindi non ci vorrà inavvertitamente cambiare livello di registrazione per altri moduli.


Ovviamente è necessario utilizzare logger.debug anziché logging.debug poiché quest'ultimo è una funzione comfort che chiama il metodo del logger principale debug.

Questo è menzionato nel Advanced Logging Tutorial. Permette anche di sapere quale modulo ha attivato il messaggio di registro in un modo semplice.

4

@Bakuriu spiega abbastanza elegantemente la funzione. Al contrario, è possibile utilizzare il metodo getLogger() per recuperare e riconfigurare/disabilitare i taglialegna indesiderati.

Volevo anche aggiungere il metodo logging.fileConfig() accetta un parametro chiamato disable_existing_loggers che disabiliterà tutti i logger precedentemente definiti (vale a dire, nei moduli importati).

7

Se si utilizza il pacchetto python logging, è una convenzione comune definire un logger in ogni modulo che lo utilizza.

logger = logging.getLogger(__name__) 

Molti pacchetti python popolari fanno, compresi requests. Se un pacchetto utilizza questa convenzione, è facile abilitare/disabilitare la registrazione per esso, perché il nome del logger avrà lo stesso nome del pacchetto (o sarà figlio di quel logger). È anche possibile accedere allo stesso file degli altri logger.

logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

requests_logger = logging.getLogger('requests') 
requests_logger.setLevel(logging.DEBUG) 

handler = logging.StreamHandler() 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 
requests_logger.addHandler(handler) 
+0

Si noti che quando si tenta di configurare i propri logger come nell'esercitazione di base ufficiale con 'logging.basicConfig (...)' tutti i logger ora verranno inviati a 'logging.lastResort' (a partire da Python 3.2, che è stderr) se non è stato fornito alcun gestore o al gestore che hai impostato. Quindi non usarlo o continuerai comunque a ricevere tutti i messaggi di registro. – user136036

0

Questo disattiva tutti i registratori esistenti, come quelli creati da moduli importati, pur utilizzando il logger principale (e senza dover caricare un file esterno).

logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

Si noti che è necessario importare tutti i moduli che non si desidera registrato prima! Altrimenti quelli non saranno considerati come "logger esistenti". Disabiliterà quindi tutti i logger da quei moduli. Questo potrebbe farti perdere anche errori importanti!

Per esempi più dettagliati utilizzando opzioni correlate per la configurazione, vedere https://gist.github.com/st4lk/6287746, e here è una (parzialmente lavorazione) esempio utilizzando YAML per configurazione con la libreria coloredlog.

+0

Qual è la tua domanda? – user1767754

+0

Ad esempio, funziona con 'request', ma non funzionerà quando i moduli importati creano i loro logger all'interno della classe che chiamereste in seguito, come fa' APScheduler' quando chiamate 'BackgroundScheduler.BackgroundScheduler()'. Vedi qui per una soluzione: https://stackoverflow.com/a/48891485/2441026 – user136036

Problemi correlati