我可以通过记录在一行中创建Python输出异常吗?

时间:2018-02-06 11:33:54

标签: python logging traceback

我正在使用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块。口袋妖怪式的。有更好的解决方案吗?

3 个答案:

答案 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)