2013-06-14 16 views
7

Per il mio primo esperimento di registrazione in Python (2.7) sto creando un modulo di registrazione di base, che creerà rapidamente un logger (quindi non dovrò configurarlo per modulo /classe).Registrazione Python: visualizza solo le informazioni dal livello di debug

Quello che voglio fare è creare un logger che visualizza tutti i messaggi di livello INFO e superiori sulla console e sposta tutte le informazioni di livello DEBUG in un file di testo.

Finora ho creato un registratore che stampa INFO e fino alla console e che stampa tutti i messaggi di registro in un file di testo. Tuttavia, non voglio tutti i messaggi INFO e superiori nel mio file di testo.

Ho creato uno Python Fiddle che contiene il mio codice.

ho usato i seguenti messaggi di debug da un tutorial:

log.debug('All systems operational') 
log.info('Airspeed 300 knots') 
log.warn('Low on fuel') 
log.error('No fuel. Trying to glide.') 
log.critical('Glide attempt failed. About to crash.') 

che sulla produzione di console:

[INFO] root: Airspeed 300 knots 
[WARNING] root: Low on fuel 
[ERROR] root: No fuel. Trying to glide. 
[CRITICAL] root: Glide attempt failed. About to crash. 

E nel mio file debug_log.txt:

2013-06-14 14:51:46,963:DEBUG:root:All systems operational 
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots 
2013-06-14 14:51:46,964:WARNING:root:Low on fuel 
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide. 
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash. 

In il blocco precedente, le ultime quattro righe non dovrebbero essere nel file. È quello che sto cercando di fare e come otterrei il risultato desiderato?

risposta

11

È necessario creare il proprio handler object.

Dalla documentazione: La classe FileHandler, presente nel pacchetto di registrazione principale, invia l'output di registrazione a un file su disco. Eredita la funzionalità di output da StreamHandler. Quindi, l'idea è di estendere la classe FileHandler e, nel metodo emit(), filtrare tutti gli oggetti record che non si trovano nel livello logging.DEBUG.

non ho ancora testato questo, ma penso che avrebbe fatto il lavoro:

from logging import FileHandler, DEBUG 
log = logging.getLogger('foo') 

class DebugFileHandler(FileHandler): 
    def __init__(self, filename, mode='a', encoding=None, delay=False) 
     FileHandler.__init__(self, filename, mode, encoding, delay) 

    def emit(self, record): 
     if not record.levelno == DEBUG: 
      return 
     FileHandler.emit(self, record) 

log.addHandler(DebugFileHandler()) 

Naturalmente, si dovrà adattare questo codice al tuo codice. E, ad essere onesti, record.level è una supposizione sfrenata, ma penso che abbia senso :-) E, I got it right!

In questo esempio il gestore verrà applicato solo per il logger foo. Potresti volerlo attivare per il tuo gestore principale o solo per alcuni gestori specifici, come preferisci.

+1

Ecco, stavo proprio scrivendo :-) – zmo

+1

Grazie, dovrò guardare quale codice funziona esattamente, ma con queste informazioni ci arriverò. :) –

+1

Per riferimenti futuri, penso che sia bello sottolineare quanto segue: Il codice sopra riportato funziona principalmente. Ci sono alcuni due punti mancanti alla fine della lezione, ma quelli sono facili da individuare. Se si sostituisce la riga 'if record.level! = DEBUG:' con 'se non record.levelno == DEBUG:', tutti i registri non DEBUG vengono filtrati bene. –

Problemi correlati