Регистрация трассировки стека исключений вместе с вызовами фактических значений аргументов метода в Python - PullRequest
0 голосов
/ 03 января 2019

Мне нужно знать, как вести журнал трассировки стека исключений вместе с фактическими значениями аргументов метода.

Чтобы уточнить мое требование, пожалуйста, обратитесь к следующему примеру:

Пример кода

import logging
def a(str, str2):
    print str + str2
    raise Exception("Custom err ==> " + str + "----" + str2)
def b(str):
    a(str, "World!")
def c(str):
    b(str)
try:
    val = 'Hello' #Let's say this value is coming from DB
    c(val)
except:
    logging.exception("err", exc_info=True)

Фактическая трассировка стека в Python

HelloWorld!
ERROR:root:err
Traceback (most recent call last):
  File "except.py", line 14, in <module>
    c('Hello')
  File "except.py", line 11, in c
    b(str)
  File "except.py", line 8, in b
    a(str, "World!")
  File "except.py", line 5, in a
    raise Exception("Custom err ==> " + str + "----" + str2)
Exception: Custom err ==> Hello----World!

Требуется трассировка стека в Python

HelloWorld!
ERROR:root:err
Traceback (most recent call last):
  File "except.py", line 14, in <module>
    c('Hello')
  File "except.py", line 11, in c
    b('Hello')
  File "except.py", line 8, in b
    a('Hello', "World!")
  File "except.py", line 5, in a
    raise Exception("Custom err ==> " + str + "----" + str2)
Exception: Custom err ==> Hello----World!

Если вы внимательно посмотрели в Требуется трассировка стека в разделе Python , я заменил оцененные значения аргументов метода в трассировке стека.

Надеюсь, этот пример дает ясную картину моих требований

1 Ответ

0 голосов
/ 04 января 2019

Вы, вероятно, не должны использовать str в качестве имени, но это не относится к делу.

Вы не можете иметь свое желание - модуль регистрации не печатает значения, он печатает имена, используемые в качестве параметров.См. Измененную программу (большинство имен переменных изменены):

import logging
def a(var_name_in_a, var_name_in_a_2):
    print var_name_in_a + var_name_in_a_2
    raise Exception("Custom err ==> " + var_name_in_a + "----" + var_name_in_a_2)
def b(var_name_in_b):
    a(var_name_in_b, "World!")
def c(var_name):
    b(var_name)
try:
    val = 'Hello' #Let's say this value is coming from DB
    c(val)
except:
    logging.exception("stdout", exc_info=True)

и ее вывод:

HelloWorld!
ERROR:root:err
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    c(val)
  File "test.py", line 8, in c
    b(var_name)
  File "test.py", line 6, in b
    a(var_name_in_b, "World!")
  File "test.py", line 4, in a
    raise Exception("Custom err ==> " + var_name_in_a + "----" + var_name_in_a_2)
Exception: Custom err ==> Hello----World!

Если вы хотите, чтобы значения вам приходилось регистрировать отдельно от исключения - и добывает - потом эта информация теряется.

...