2013-07-08 9 views
10

Desidero utilizzare il gestore di registrazione StreamHandler di python. quello che ho provato a dire,Python: logging.streamhandler non invia i registri allo stdout

import logging 
import sys 
mylogger = logging.getLogger("mylogger") 
h1 = logging.StreamHandler(stream=sys.stdout) 
h1.setLevel(logging.DEBUG) 

mylogger.addHandler(h1) 

# now trying to log with the created logger 
mylogger.debug("abcd") # <no output> 
mylogger.info("abcd") # <no output> 
mylogger.warn("abcd") # abcd 

mi sto perdendo qualcosa? O facendo qualcosa di sbagliato? Perché i registri di livello INFO e DEBUG non arrivano su STDOUT?

risposta

16

è necessario impostare il livello del logger, non solo il livello del gestore:

mylogger.setLevel(logging.DEBUG) 

Ecco una bella grafica del flusso di lavoro di registrazione, dove si può vedere che o il registratore e il gestore controllare il livello di log:

http://docs.python.org/2/howto/logging.html#logging-flow

il valore di default è logLevelWARNING, quindi, anche se si imposta il livello del vostro gestore per DEBUG, il messaggio non sarà possibile ottenere attraverso, dal momento che il tuo logger lo sopprime (è anche predefinito WARNING).

A proposito, si può fare qualche formattazione di base con Formatter:

import logging 
import sys 

mylogger = logging.getLogger("mylogger") 

formatter = logging.Formatter('[%(levelname)s] %(message)s') 

handler = logging.StreamHandler(stream=sys.stdout) 
handler.setFormatter(formatter) 
handler.setLevel(logging.DEBUG) 

mylogger.addHandler(handler) 
mylogger.setLevel(logging.DEBUG) 

mylogger.debug("This is a debug message.") 
mylogger.info("Some info message.") 
mylogger.warning("A warning.") 

vi darà l'uscita

[DEBUG] This is a debug message. 
[INFO] Some info message. 
[WARNING] A warning. 
+0

Stavo seguendo alcuni documenti di base, http: //docs.python. org/2/howto/logging.html # logging-advanced-tutorial Doc dice setLevel sul gestore. Questo documento è sbagliato? –

+2

No, non è sbagliato, come puoi vedere in http://docs.python.org/2/howto/logging.html#logging-flow il logger passa la chiamata di registrazione al gestore dopo che ha controllato il livello. Quindi, se il livello del registratore è impostato su 'WARN', e un messaggio' DEBUG' sta arrivando, non viene eseguito nulla. Se un messaggio passa, il registratore lo consegna al gestore, che ha anche un tipo di "filtro" di registrazione. – tamasgal

+0

perché devo impostare il livello del logger se ho impostato il livello del gestore? perché impostarlo due volte? sembra essere ridondante. – ospider

Problemi correlati