captureWarnings设置为True并不捕获警告

时间:2016-07-22 16:57:27

标签: python python-2.7 logging

我想记录所有警告,假设将captureWarnings设置为True应该可以解决问题。但它并没有。代码:

import logging
import warnings

from logging.handlers import RotatingFileHandler

logger_file_handler = RotatingFileHandler(u'./test.log')
logger_file_handler.setLevel(logging.DEBUG)

logging.captureWarnings(True)

logger = logging.getLogger(__name__)

logger.addHandler(logger_file_handler)
logger.setLevel(logging.DEBUG)

logger.info(u'Test')
warnings.warn(u'Warning test')

我的期望是'警告测试'应该出现在test.log中,但它不仅仅是测试'放在日志文件中。

如何捕获所有警告并将其重定向到日志文件?

Python 2.7.5

3 个答案:

答案 0 :(得分:11)

来自logging.captureWarnings文档:

  

警告模块发出的警告将被重定向到   测井系统。具体来说,将使用格式化警告   warnings.formatwarning()并将生成的字符串记录到记录器中   名为'py.warnings',严重程度为WARNING

你可能想要这样的东西:

import logging
import warnings

from logging.handlers import RotatingFileHandler

logger_file_handler = RotatingFileHandler(u'test.log')
logger_file_handler.setLevel(logging.DEBUG)

logging.captureWarnings(True)

logger = logging.getLogger(__name__)
warnings_logger = logging.getLogger("py.warnings")

logger.addHandler(logger_file_handler)
logger.setLevel(logging.DEBUG)
warnings_logger.addHandler(logger_file_handler)

logger.info(u'Test')
warnings.warn(u'Warning test')

希望它有所帮助!

答案 1 :(得分:1)

logging.captureWarnings未使用您的记录器。它使用名为'py.warnings'的记录器。您需要配置该记录器以执行您想要的操作。

答案 2 :(得分:0)

应用代码库中,您可以-并且可能想要-配置 root py.warnings记录器。 >记录器。这将:

  • 记录来自py.warnings(集成captureWarnings的记录器)中的内容
  • 记录创建自己的记录器并登录的库中的内容
  • 允许您直接使用logging.info之类的日志记录模块功能进行日志记录,而不是创建记录器对象

以下简单的演示记录了您希望的警告:

import logging
import warnings

from logging.handlers import RotatingFileHandler

logger_file_handler = RotatingFileHandler(u'./test.log')
logger_file_handler.setLevel(logging.DEBUG)

logging.captureWarnings(True)

root_logger = logging.getLogger()

root_logger.addHandler(logger_file_handler)
root_logger.setLevel(logging.DEBUG)

logging.info(u'Test')
warnings.warn(u'Warning test')