Одним из возможных решений является добавление __repr__
в ваш класс, который будет возвращать то, что вы хотите записать:
def __repr__(self):
return str(self.auth_token)
Это решение не является гибким, потому что если вы хотите регистрировать self.auth_token
в одной функции и self.other_attribute
в другой, вам необходимо регистрировать их оба каждый раз:
def __repr__(self):
return str(self.auth_token, self.other_attribute)
Это запутает ваши логи def generate_auth_token(self):
, потому что вы хотите только логи self.auth_token
Другое решение, которое я могу предложить, - использовать eval
. Я знаю, что eval
это зло, но, возможно, это подходящее место для его использования. Изменения в вашем коде:
1) Декоратор будет использоваться следующим образом:
@log_input_output(logger_name=__name__, log_eval='f"token is {self.auth_token}"')
2) параметр log_eval
:
def log_input_output(logger_name='', func_name=None, log_input_values=True, log_eval=''):
3) if log_eval
блок после if kwargs
:
if kwargs:
logger.debug(f'{message_prefix} input kwargs: {kwargs}')
if log_eval:
signature = inspect.signature(func)
bind = signature.bind(*args, **kwargs)
custom_log = eval(log_eval, bind.arguments)
logger.debug(f'{message_prefix} custom log: {custom_log}')
Итак, журнал будет выглядеть так:
generate_auth_token custom log: token is d0173388-f043-4e8b-8630-05634e2fd3c6
С этим решением вы можете регистрировать только self.other_attribute
при выполнении другой функции:
@log_input_output(logger_name=__name__, log_eval='f"other_attribute is {self.other_attribute}"')
def other_function(self):
pass