我正在尝试用python记录未捕获的异常。为此,我在__init__.py
中设置sys.excepthook
,如下所示
import sys
import logging
import traceback
def log_except_hook(*exc_info):
logger = logging.getLogger(__name__)
text = "".join(traceback.format_exception(*exc_info))
logger.critical(f"Unhandled exception:\n{text}")
sys.excepthook = log_except_hook
我的问题是,当我运行一个进程并发生异常时,记录的异常中的模块名称是包含代码的文件夹的名称(在本例中是src
),而不是发生异常的函数的名称(在本例中是foo_produce_an_error
)。请查看以下示例:
2019-10-09 18:55:48,638 src CRITICAL: Unhandled exception:
Traceback (most recent call last):
File "/Users/ivallesp/Projects/Project_Folder/main.py", line 109, in <module>
foo_function(7)
File "/Users/ivallesp/Projects/Project_Folder/src/new_module.py", line 8, in foo_function
foo_produce_an_error(x)
File "/Users/ivallesp/Projects/Project_Folder/src/new_module.py", line 12, in foo_produce_an_error
x / 0
ZeroDivisionError: division by zero
如何进行日志记录以显示第一行中出现错误的函数的模块和名称
您没有提供足够的信息来回答这个问题—例如,您是如何配置日志记录的(特别是所使用的格式字符串/格式化程序)。我可以用一个例子来说明如何达到预期的结果。假设模块
failfunc
中有一个失败的函数:那么,您的主要脚本可能是:
运行时,它会打印
请注意使用
exc_info
关键字参数将回溯到日志中的稍微简单的方法。还要注意,在这种情况下,正常的模块和函数名(可以在格式字符串中使用%(module)s
和%(funcName)s
显示)将是sys.excepthook
指向的那些,而不是实际发生异常的值。对于这些,您必须按照我所演示的方式使用traceback对象来获取最底层的帧(实际发生异常的位置),并从该帧获取模块和函数名模块很难获取,但您可以有文件名和行号。它们包含在exc\u信息中,您不需要自己格式化。您只需将它们传递给log函数,并使用格式化程序来显示它们。下面是一个示例代码,让您了解如何做到这一点:
相关问题 更多 >
编程相关推荐