2012-11-12 15 views
6

Ho usato il seguente codice per ottenere avvertimenti essere registrato:Come formattare gli avvisi catturati con logging.captureWarnings?

import logging 
logging.captureWarnings(True) 
formatter = logging.Formatter('%(asctime)s\t%(levelname)s\t%(message)s') 
console_handler = logging.StreamHandler() 
console_handler.setLevel(logging.DEBUG) 
console_handler.setFormatter(formatter) 

Questo funziona, tuttavia, la mia registrazione formattatore non viene applicata, e gli avvertimenti venire fuori cercando in questo modo:

WARNING:py.warnings:/home/joakim/.virtualenvs/masterload/local/lib/python2.7/site-packages/MySQL_python-1.2.3c1-py2.7-linux-x86_64.egg/MySQLdb/cursors.py:100: Warning: 
InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. 

invece del formato previsto:

2012-11-12 18:19:44,421 INFO START updating products 

Come posso applicare la mia normale formattazione ai messaggi di avviso acquisiti?

risposta

5

È stato creato un gestore, ma mai configurato il modulo di registrazione per utilizzarlo:

console_handler = logging.StreamHandler() 
console_handler.setLevel(logging.DEBUG) 
console_handler.setFormatter(formatter) 

È necessario aggiungere questo gestore ad un registratore; il logger root ad esempio:

logging.getLogger().addHandler(console_handler) 

In alternativa, è possibile aggiungere il gestore solo al registratore di avvisi; le captureWarnings() documentation afferma che usa py.warnings Per avvisi catturati:

logging.getLogger('py.warnings').addHandler(console_handler) 

Invece di creare un gestore e formattatore in modo esplicito, si può anche chiamare basicConfig() per configurare il logger principale:

logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', level=logging.DEBUG) 

La configurazione base sopra è l'equivalente morale della configurazione del gestore che hai impostato.

3

logging.captureWarnings log ad un logger di nome py.warnings, quindi è necessario aggiungere la gestore a quella logger:

import logging 

logging.captureWarnings(True) 
formatter = logging.Formatter('%(asctime)s\t%(levelname)s\t%(message)s') 
console_handler = logging.StreamHandler() 
console_handler.setLevel(logging.DEBUG) 
console_handler.setFormatter(formatter) 
py_warnings_logger = logging.getLogger('py.warnings') 
py_warnings_logger.addHandler(console_handler) 
0

Il documentation dice che Se la cattura è True, avvisi emessi dal modulo di avvertimenti per essere ridiretti su il sistema di registrazione. In particolare, un avviso verrà formattato utilizzando warnings.formatwarning() e la stringa risultante registrata su un logger denominato "py.warnings" con una gravità di WARNING.

Perciò vorrei provare a

# get the 'py.warnings' logger 
log = logging.getLogger('py.warnings') 
# assign the handler to it 
log.addHandler(console_handler) 
Problemi correlati