Python 日志记录。将格式化程序与 logging.exception() 一起使用

Roy*_*yHB 5 python logging error-logging python-2.7

我有一个日志格式化程序,当前将所有常规日志级别格式化为 json 字符串。当我想查看日志时,我使用带有 javascript 的网页将 json 转换为 's in a table。我使用的格式化程序是:

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>'
)
Run Code Online (Sandbox Code Playgroud)

这工作正常。我现在想使用 logging.exception() 记录异常。

似乎 logging.exception 不提供在所有其他日志记录级别中找到的项目的字典。

如何捕获 logging.exception 提供的堆栈跟踪,以便我可以将其转换为与我为所有其他类型的日志条目创建的 json 兼容的形式?对于 logging.exception,我需要的是获取堆栈跟踪并将其放入 json 的“msg”元素中。如果 logging.exception 不提供其他 dict 元素,如 asctime、level 等,我可以自己即时创建它们。

ale*_*cxe 3

看起来这与logging.exception不接受“额外”错误有关(已在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)
Run Code Online (Sandbox Code Playgroud)

也可以看看: