为什么这个代码段失败了``AttributeError:'CustomAdapter'对象没有属性'setLevel'``?

时间:2013-10-30 22:35:16

标签: python logging

我将以下内容放入名为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")

1 个答案:

答案 0 :(得分:5)

你没有错。文档声明不受支持的功能。 LoggerAdapter类继承自object,而不是Logger,因此它仅支持它明确定义的方法。但是,它会将您传入的记录器实例存储为self.logger。

所以,现在,你可以这样做:

adapter.logger.setLevel(logging.WARN)

我同意,这可能是文档中的错误,也可能是实现中的错误,具体取决于您如何看待它。