7

我使用以下代码来获取要记录的警告:

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

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

4

3 回答 3

6

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)
于 2012-11-12T17:57:49.697 回答
6

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

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

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

logging.getLogger().addHandler(console_handler)

或者,您可以仅将处理程序添加到警告记录器;该captureWarnings()文档指出它py.warnings用于捕获的警告:

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

除了显式创建处理程序和格式化程序之外,您还可以调用basicConfig()来配置根记录器:

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

上面的基本配置是你设置的处理程序配置的道德等价物。

于 2012-11-12T18:08:04.133 回答
0

文档如果捕获为真,警告模块发出的警告将被重定向到日志系统具体来说,将使用 warnings.formatwarning() 格式化警告,并将生成的字符串记录到名为 'py.warnings' 的记录器,其严重性为 WARNING。

因此我会尝试

# get the 'py.warnings' logger
log = logging.getLogger('py.warnings')
# assign the handler to it
log.addHandler(console_handler)
于 2012-11-12T17:58:49.033 回答