我正在使用AWS并使用AWS cloudwatch查看日志。虽然事情不应该在AWS上破坏,但他们可以。我刚才有这样的案子。然后我搜索了Traceback
并得到了行
Traceback (most recent call last):
没有实际的追溯。我有一个有效的结构化日志设置(参见other question),我希望以类似的方式获得回溯。
所以而不是:
Traceback (most recent call last):
File "/home/math/Desktop/test.py", line 32, in <module>
adf
NameError: name 'adf' is not defined
类似
{"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"}
甚至更好地使用JSON格式的字符串。
实现这一目标的唯一方法我可以想到的是一个巨大的try-except块。口袋妖怪式的。有更好的解决方案吗?
答案 0 :(得分:2)
您可以使用sys.excepthook
。只要脚本中发生异常,就会调用它。
localStorage.setItem('jwt', <%=jwt%>);
然后在您的脚本中,您必须覆盖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))
的值。
sys.excepthook
现在每当发生异常时,都会记录您的记录器处理程序。
注意:在运行此
之前,请不要忘记设置记录器答案 1 :(得分:0)
万一有人希望该异常以其默认格式(但由于某种原因)以一行记录(基于接受的答案)记录下来:
def exception_logging(exctype, value, tb):
"""
Log exception in one line by using the root logger.
Parameters
----------
exctype : exception type
value : seems to be the Exception object (with its message)
tb : traceback
"""
logging.error(''.join(traceback.format_exception(exctype, value, tb)))
还请注意,它使用logging.error()而不是logging.exception(),后者还会打印一些额外的“ NoneType:None”行。
另请注意,它似乎只适用于未捕获的异常。
有关记录捕获的异常,请访问How do I can format exception stacktraces in Python logging?,并查看我的答案。
答案 2 :(得分:0)
略有不同:如果您运行Flask应用程序,则可以执行以下操作:
@app.errorhandler(Exception)
def exception_logger(error):
"""Log the exception."""
logger.exception(str(error))
return str(error)