1

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

1 回答 1

6

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

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

adapter.logger.setLevel(logging.WARN)

我同意,这要么是文档中的错误,要么是实现中的错误,这取决于您如何看待它。

于 2013-10-30T22:52:45.997 回答