#python #logging #decorator
Вопрос:
Итак, в main.py Я настроил разные уровни ведения журнала:
logging.METRICS = logging.INFO 1
logging.TIME = logging.METRICS 1
logging.DATAPROCESSING = logging.TIME 1
...and so on
logging.addLevelName(logging.METRICS, 'METRICS')
logging.addLevelName(logging.TIME, 'TIME')
Декоратор в другом месте кода фактически видит его (и выводит как такой уровень), когда он вызывается явно так:
@decorator(logger_level=25)
def func(args):
но когда я называю его так, он не распознает его как такой уровень и выводит, что ведение журнала не имеет такого атрибута:
@decorator(logger_level=logging.METRICS)
def func(args):
Мой вопрос в том, почему это так? Загружается ли декоратор входа в систему быстрее, чем настройка новых атрибутов? Как мне преодолеть это, мне действительно понадобятся новые пользовательские уровни ведения журнала.
Декоратор выглядит так:
def decorator(logger_level=logging.INFO):
def timedecorator(method):
@functools.wraps(method)
def timed(self, *args, **kw):
ts = time.time()
result = method(self, *args, **kw)
te = time.time()
logging.getLogger('time').log(logger_level, 'time: %r %2.2f ms', method.__name__, (te - ts) * 1000)
return result
return timed
return timeitdecorator
Ответ №1:
addLevelName
не добавляет уровень в качестве переменной на уровне модуля. Это помещает его в словарь имен уровней. Вы должны позвонить своему декоратору вот так: @decorator(logger_level="METRICS")
. Также работает для встроенных уровней.
Вам также нужно немного изменить декоратора:
level = logging._checkLevel(logger_level) // translate level string to int
logging.getLogger('time').log(level, /*other args*/)
Комментарии:
1. Я не могу этого сделать из-за
level
аргумента вlog
целых числах… и хотя это был бы более элегантный дизайн (я предполагаю, что я бы делалgetattr(logging, logger_level)
или что-то подобное), декоратор все еще не видит этого уровня… :/