2012-11-12 6 views
6

Ich habe den folgenden Code zu bekommen Warnungen verwendet werden protokolliert:Wie formatiere ich Warnungen, die mit logging.captureWarnings erfasst wurden?

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. 

: so aussieht

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) 

Dies funktioniert jedoch meine Logging-Formatierer nicht angewendet wird, und die Warnungen kommen anstelle des erwarteten Formats:

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

Wie kann ich meine normale Formatierung auf erfasste Warnmeldungen anwenden?

Antwort

5

Sie einen Handler erstellt, aber nie das Protokollierungsmodul verwenden, konfiguriert:

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

Sie müssen diese Prozedur zu einem Logger hinzuzufügen; Der Root-Logger zum Beispiel:

logging.getLogger().addHandler(console_handler) 

Alternativ können Sie den Handler nur zum Warnungslogger hinzufügen; die captureWarnings() documentation Staaten, die es py.warnings für gefangene Warnungen verwendet:

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

Statt einen Handler und Formatierungsprogramm explizit zu erstellen, können Sie auch einfach anrufen basicConfig() den Root-Logger zu konfigurieren:

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

Die obige Grundkonfiguration ist das moralische Äquivalent der von Ihnen eingerichteten Handlerkonfiguration.

3

logging.captureWarnings Protokolle an einen Logger py.warnings benannt, so dass Sie Ihren Handler zu diesem Logger hinzufügen müssen:

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

Die documentation sagt, dass Wenn Capture Zwar warnten die Warnungen Modul wird umgeleitet das Protokollierungssystem. Insbesondere wird eine Warnung mithilfe von warnings.formatwarning() formatiert, und die resultierende Zeichenfolge wird in einer Protokollfunktion namens "py.warnings" mit dem Schweregrad WARNING protokolliert.

Deshalb würde ich versuchen,

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