Имя уровня в журнале python до того, как декоратор журналов не увидит пользовательские уровни

#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) или что-то подобное), декоратор все еще не видит этого уровня… :/