Python日志。使用formatter与logging.exception()

6 投票
1 回答
5358 浏览
提问于 2025-04-18 05:52

我有一个日志格式化工具,它可以把所有常见的日志级别格式化成一个json字符串。当我想查看日志时,我会用一个网页和一些javascript代码,把这个json转换成表格里的内容。

formatter = logging.Formatter(
    '{"datetime":"%(asctime)s","level":"%(levelname)s","app":"%(app_name)s","module":"%(module)s",' +
    '"line":"%(lineno)d","function":"%(funcName)s","msg":"%(msg)s"}'   #<switch2>'
)

这个方法运行得很好。现在我想用logging.exception()来记录异常信息。

看起来,logging.exception并没有提供其他日志级别中常见的那些字典项。

我该如何获取logging.exception提供的堆栈跟踪信息,以便把它转换成我为其他日志条目创建的json格式?我需要的是,把logging.exception的堆栈跟踪信息抓取出来,放到json的“msg”元素里。如果logging.exception没有提供像时间、级别等其他字典元素,我可以自己动态创建这些元素。

1 个回答

3

看起来这个问题和logging.exception不接受'extra'的bug有关(这个问题在2.7和3.2版本中已经修复了)。

作为一种解决方法,可以使用logging.error(),并传入exc_info=True这个参数。

顺便提一下,logging.exception()其实在内部是调用了logging.error(),引用自cpython 2.7的源代码

def exception(self, msg, *args, **kwargs):
    """
    Convenience method for logging an ERROR with exception information.
    """
    kwargs['exc_info'] = True
    self.error(msg, *args, **kwargs)

另外,参考一下:

撰写回答