我使用以下代码来记录警告:
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
如何将常规格式应用于捕获的警告消息?
答案 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)