<p>您没有提供足够的信息来回答这个问题—例如,您是如何配置日志记录的(特别是所使用的格式字符串/格式化程序)。我可以用一个例子来说明如何达到预期的结果。假设模块<code>failfunc</code>中有一个失败的函数:</p>
<pre><code># failfunc.py
def the_failing_func():
1 / 0
</code></pre>
<p>那么,您的主要脚本可能是:</p>
<pre><code># logtest_ue.py
import logging
import sys
from failfunc import the_failing_func
def log_except_hook(*exc_info):
logger = logging.getLogger(__name__)
tb = exc_info[-1]
# get the bottom-most traceback entry
while tb.tb_next:
tb = tb.tb_next
modname = tb.tb_frame.f_globals.get('__name__')
funcname = tb.tb_frame.f_code.co_name
logger.critical('Unhandled in module %r, function %r: %s',
modname, funcname, exc_info[1], exc_info=exc_info)
sys.excepthook = log_except_hook
def main():
the_failing_func()
if __name__ == '__main__':
logging.basicConfig(format='%(levelname)s %(message)s')
sys.exit(main())
</code></pre>
<p>运行时,它会打印</p>
<pre><code>CRITICAL Unhandled in module 'failfunc', function 'the_failing_func': division by zero
Traceback (most recent call last):
File "logtest_ue.py", line 23, in <module>
sys.exit(main())
File "logtest_ue.py", line 19, in main
the_failing_func()
File "/home/vinay/projects/scratch/failfunc.py", line 2, in the_failing_func
1 / 0
ZeroDivisionError: division by zero
</code></pre>
<p>请注意使用<code>exc_info</code>关键字参数将回溯到日志中的稍微简单的方法。还要注意,在这种情况下,正常的模块和函数名(可以在格式字符串中使用<code>%(module)s</code>和<code>%(funcName)s</code>显示)将是<code>sys.excepthook</code>指向的那些,而不是实际发生异常的值。对于这些,您必须按照我所演示的方式使用traceback对象来获取最底层的帧(实际发生异常的位置),并从该帧获取模块和函数名</p>