如何格式化使用logging.captureWarnings捕获的警告?

时间:2012-11-12 17:20:31

标签: python logging warnings

我使用以下代码来记录警告:

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)

但是,我的日志记录格式化程序未应用,警告显示如下:

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.

而不是预期的格式:

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

如何将常规格式应用于捕获的警告消息?

3 个答案:

答案 0 :(得分:6)

您创建了一个处理程序,但从未配置日志记录模块使用它:

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

您需要将此处理程序添加到记录器;根记录器,例如:

logging.getLogger().addHandler(console_handler)

或者,您只能将处理程序添加到警告记录器中; captureWarnings() documentation表示它使用py.warnings来捕获警告:

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

您也可以只调用basicConfig()来配置根记录器,而不是显式创建处理程序和格式化程序:

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

上述基本配置与您设置的处理程序配置相当。

答案 1 :(得分:4)

logging.captureWarnings会记录到名为py.warnings的记录器,因此您需要将处理程序添加到该记录器:

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)

答案 2 :(得分:0)

documentation表示如果捕获为True,警告模块发出的警告将被重定向到日志记录系统。具体来说,将使用warnings.formatwarning()格式化警告,并将结果字符串记录到名为“py.warnings”的记录器中,其严重性为WARNING。

因此我会尝试

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