2012-11-12 3 views
6

Użyłem poniższy kod, żeby dostać ostrzeżenia, aby się zalogować:Jak sformatować ostrzeżenia przechwycone przez 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) 

To działa, jednak mój rejestrowania formater nie jest stosowana, a ostrzeżenia wyjdzie patrząc tak:

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. 

zamiast oczekiwanego formatu:

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

Jak mogę zastosować normalne formatowanie do przechwyconych komunikatów ostrzegawczych?

Odpowiedz

5

Utworzono obsługi, ale nigdy skonfigurowany moduł rejestrowania go używać:

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

Trzeba dodać ten program obsługi do rejestratora; rejestrator korzeń na przykład:

logging.getLogger().addHandler(console_handler) 

Alternatywnie, można dodać tylko do obsługi rejestratora ostrzeżeń; z captureWarnings() documentation stwierdza, że ​​używa py.warnings dla przechwyconych ostrzeżeń:

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

Zamiast tworzenia przewodnika i formatowania wyraźnie, można też po prostu zadzwonić basicConfig() skonfigurować rejestrator root:

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

Powyższa podstawowa konfiguracja jest moralnym odpowiednikiem skonfigurowanej konfiguracji obsługi.

3

logging.captureWarnings logi do rejestratora o nazwie py.warnings, więc trzeba dodać obsługi do tego rejestratora:

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

documentation mówi, że Jeśli przechwytywania jest prawda, ostrzeżenia wydawane przez moduł ostrzeżeń zostanie przekierowany do system logowania. W szczególności ostrzeżenie zostanie sformatowane przy użyciu ostrzeżeń.formatwarning(), a wynikowy ciąg zostanie zapisany w programie rejestrującym o nazwie "py.warnings" o ważności OSTRZEŻENIE.

Dlatego chciałbym spróbować

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