Вы не предоставили достаточно информации, чтобы ответить на вопрос - например, как вы настроили ведение журнала (в частности, использовалась строка формата / форматер). Я могу проиллюстрировать, как добиться желаемого результата в целом, на примере. Предположим, у вас есть неисправная функция в модуле failfunc
:
# failfunc.py
def the_failing_func():
1 / 0
Тогда ваш главный скрипт может быть:
# 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())
, когда он запущен, он печатает
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
Обратите внимание на несколько более простой способ получения трассировки в журнале, используя параметр ключевого слова exc_info
. Также обратите внимание, что в этом случае обычное имя модуля и функции (которое может отображаться с использованием %(module)s
и %(funcName)s
в строке формата) будут теми, на которые указывает sys.excepthook
, а не значениями, где фактически произошло исключение,Для этого вам придется использовать объект трассировки, как я иллюстрировал, чтобы получить самый нижний фрейм (где на самом деле произошло исключение) и получить имена модулей и функций из этого фрейма.