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块。宠物小精灵风格。有更好的解决方案吗?
您可以使用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)
现在,每当发生异常时,它将使用您的记录器处理程序进行记录。
注意:在运行此功能之前,请不要忘记设置记录器