如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?

Posted

技术标签:

【中文标题】如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?【英文标题】:How do I log an exception at warning- or info-level with traceback using the python logging framework? 【发布时间】:2010-09-16 13:48:59 【问题描述】:

使用这样的东西:

try:
   # Something...
except Exception as excep:
   logger = logging.getLogger("component")
   logger.warning("something raised an exception: " + excep)
   logger.info("something raised an exception: " + excep)

我宁愿不把它放在错误级别,因为在我的特殊情况下它不是错误。

【问题讨论】:

【参考方案1】:

你可以试试这个:

from logging import getLogger

logger = getLogger('warning')

try:
    # Somethings that is wrong.

except Exception as exp:
    logger.warning("something raised an exception: " , exc_info=True)
    logger.warning("something raised an exception: ".format(exp))  # another way

【讨论】:

IIRC,这些不会做同样的事情。第一种方式记录堆栈跟踪,第二种方式记录发生的异常的异常类的名称。那是非常不同的。 @BrianPeterson 问题的目的是打印exp。两个提到的记录器方法都实现了这一点。我现在测试了。【参考方案2】:

来自logging documentation:

检查kwargs 中的三个关键字参数:exc_infostack_infoextra

如果exc_info 的评估结果不为假,则会将异常信息添加到日志消息中。如果提供了异常元组(以sys.exc_info()返回的格式)或异常实例,则使用它;否则调用sys.exc_info()获取异常信息。

这样做:

logger.warning("something raised an exception:", exc_info=True)

【讨论】:

请注意,文档并没有明确提及此信息、警告、错误等。他们只是说“参数被解释为 debug()。” -- 这就是为什么如果您稍后需要返回此内容,您应该在此处查找有关此行为的上述描述。【参考方案3】:

这是一个可行的方法(python 2.6.5)。

logger.critical("caught exception, traceback =", exc_info=True)

【讨论】:

以上是关于如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有回溯的情况下退出 Python?

使用带有机器人框架的 python 根记录器

Python中的“内部异常”(带有回溯)?

Flask 应用程序回溯未显示在服务器日志中

制作框架并被他人使用后如何避免警告

仅当存在警告或更严重级别的日志事件时记录所有级别