Почему этот фрагмент завершается с ошибкой ``AttributeError: объект CustomAdapter не имеет атрибута 'setLevel'`?

Я поместил следующее в файл с именем repro.py, затем набрал python repro.py. (Я использую C Python 2.7.5). Не удалось с ошибкой в ​​вопросе. Источник подтверждает, что в классе LoggerAdapter нет метода с таким именем, но документы (http://docs.python.org/2/library/logging.html#logging.LoggerAdapter) говорят, что есть:

В дополнение к вышеперечисленному, LoggerAdapter поддерживает следующие методы Logger, т. е. debug(), info(), warning(), error(), exception(), Critical(), log(), isEnabledFor(), getEffectiveLevel(). , setLevel(), hasHandlers(). Эти методы имеют те же сигнатуры, что и их аналоги в Logger, поэтому вы можете использовать два типа экземпляров взаимозаменяемо.

Это баг, или я что-то не понимаю? Если последнее, действительно ли можно использовать экземпляр LoggerAdapter в качестве замены для экземпляра Logger?

import logging logging.basicConfig ()

class CustomAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        return '[%s] %s' % (self.extra['connid'], msg), kwargs

logger = logging.getLogger(__name__) 
adapter = CustomAdapter(logger, {'connid': '1234'}) 
adapter.setLevel (logging.WARN) 
adapter.warning ("Ahoy matey")

person offby1    schedule 30.10.2013    source источник
comment
Это не решит ваш вопрос, но я считаю, что это logging.WARNING, а не logging.WARN, и я попробовал ваш код, если вы удалите вызов функции setLevel, ваш код работает (вы, вероятно, уже знали это)   -  person jramirez    schedule 31.10.2013
comment
@jramirez да, я действительно это уже знал. В этом-то и суть.   -  person offby1    schedule 31.10.2013
comment
Я убежден, что это ошибка, поэтому я сообщил об этом: bugs.python.org/issue19455   -  person offby1    schedule 31.10.2013


Ответы (1)


Вы не ошиблись. В документах заявлена ​​функциональность, которая не поддерживается. Класс LoggerAdapter наследуется от object, а не от Logger, поэтому он поддерживает только те методы, которые он явно определяет. Однако он сохраняет экземпляр регистратора, который вы передаете как self.logger.

Итак, на данный момент вы можете сделать это вместо этого:

adapter.logger.setLevel(logging.WARN)

Согласен, это либо баг в документации, либо баг в реализации, смотря как на это посмотреть.

person Markku K.    schedule 30.10.2013