У меня есть декоратор, чтобы повторить некоторые операции 3 раза, если возникает тупик, и выполняет некоторую регистрацию в процессе:
def retry_on_deadlock(func):
logger = logging.getLogger('test')
@wraps(func)
def decorated(*args, **kwargs):
retry_count = 0
while retry_count < 3:
try:
return func(*args, **kwargs)
except DeadLockException:
retry_count += 1
if retry_count == 3:
raise
logger.warning('We are in the decorated function here')
return decorated
@retry_on_deadlock
def crucial_function(value):
with value:
do_something()
crucial_function(important_data)
Наш формат регистрации включает %(funcName)s
, который в данном конкретном случаеоценим до decorated
.Есть ли способ сделать так, чтобы crucial_function
появлялось в журналах?
Я уже пытался реализовать фильтр журналирования, но необходимая логика стала немного громоздкой, так как нужно проверять стек, и еслирегистрация происходила непосредственно в функции decorated
(т.е. не в функции, вызываемой исходной функцией), она будет перезаписывать funcName
в записи журнала.Если это единственный способ, я с сожалением приму его.
Обновление : Это не то же самое, что этот вопрос, так как мне все равноо сигнатуре функций (которая фактически сохраняется декоратором @wraps
).Я хочу дать указание библиотеке logging
пропускать один уровень из трассировки стека при регистрации имени функции через %(funcName)s
, %(filename)s
и %(lineno)s
.