我可以在一行中/通过日志记录来使Python输出异常吗?

Mar*_*oma 8 python logging traceback

我正在使用AWS并使用AWS Cloudwatch查看日志。虽然事情在AWS上不会中断,但可以。我只是有这种情况。然后我搜索Traceback并得到线

Traceback (most recent call last):
Run Code Online (Sandbox Code Playgroud)

没有实际的追溯。我有一个有效的结构化日志记录设置(请参阅其他问题),我想以类似的方式获取回溯。

所以代替:

Traceback (most recent call last):
  File "/home/math/Desktop/test.py", line 32, in <module>
    adf
NameError: name 'adf' is not defined
Run Code Online (Sandbox Code Playgroud)

就像是

{"message": "Traceback (most recent call last):\n      File \"/home/math/Desktop/test.py\", line 32, in <module>\n        adf\n    NameError: name 'adf' is not defined", "lineno": 35, "pathname": "/home/math/Desktop/test.py"}
Run Code Online (Sandbox Code Playgroud)

甚至还可以使用JSON格式的字符串。

我能想到的唯一方法是巨大的try-except块。宠物小精灵风格。有更好的解决方案吗?

Arp*_*nki 9

您可以使用sys.excepthook。每当脚本中发生异常时,就会调用该方法。

import logging
import sys
import traceback

def exception_logging(exctype, value, tb):
    """
    Log exception by using the root logger.

    Parameters
    ----------
    exctype : type
    value : NameError
    tb : traceback
    """
    write_val = {'exception_type': str(exctype),
                 'message': str(traceback.format_tb(tb, 10))}
    logging.exception(str(write_val))
Run Code Online (Sandbox Code Playgroud)

然后,您必须在脚本中覆盖的值sys.excepthook

sys.excepthook = exception_logging
Run Code Online (Sandbox Code Playgroud)

现在,每当发生异常时,它将使用您的记录器处理程序进行记录。

注意:在运行此功能之前,请不要忘记设置记录器