Mi manca davvero qualcosa di basilare sul modulo di registrazione di Python.Aiutami a capire il modulo di registrazione di Python ei suoi gestori
Nel seguente codice, creo un oggetto logger (log
) e aggiungo due gestori. Uno con livello "INFO" e uno con livello "ATTENZIONE". Entrambi dovrebbero stampare su stdout. Mi aspetto che la chiamata a log.info(msg)
comporterà una copia di msg
nel mio stdout e la chiamata a log.warn(msg)
potrebbe produrre in due copie di msg
stampate sul mio stdout. Ecco il codice:
import logging
import sys
logging.basicConfig()
log = logging.getLogger('myLogger')
log.handlers = []
h1 = logging.StreamHandler(sys.stdout)
h1.level = logging.INFO
h1.formatter = logging.Formatter('H1 H1 %(message)s ')
h2 = logging.StreamHandler(sys.stdout)
h2.level = logging.WARNING
h2.formatter = logging.Formatter('H2 H2 %(message)s')
log.addHandler(h1)
log.addHandler(h2)
print 'log.level == %s'%logging.getLevelName(log.level)
print 'log.info'
log.info('this is some info')
print 'done'
print 'log.warn'
log.warn('this is a warning')
print 'done'
L'uscita è davvero molto strano per me. La chiamata .info
non produce alcun effetto visivo. Tuttavia, la chiamata a warn
produce due copie di msg stampate su stdout (che è OK), ma anche una copia stampata su stderr (perché?). Questo è l'output del codice sopra. Nota la formattazione dell'ultima riga in questo output. Questa riga è stampata su stderr.
log.level == NOTSET
log.info
done
log.warn
H1 H1 this is a warning
H2 H2 this is a warning
done
WARNING:myLogger:this is a warning
Quindi le mie domande sono:
- perché fa la mia chiamata a
info
risultato in nessuna uscita, nonostante il fatto che il livelloh1
s' è impostato su INFO? - perché la mia chiamata a
warn
genera un output aggiuntivo su stderr?
Io non sono certo, ma si potrebbe essere in esecuzione in difficoltà perché 'logging' di Python ha una livelli builtin sia per avvertimento e informazioni. – brc
@brc Questo risponderebbe alla mia prima domanda, ma non il secondo –