Python'RequestsHandler'对象没有属性'filters'

时间:2018-10-20 13:58:16

标签: python python-3.x logging attributeerror

我制作了一个HTTP请求处理程序,该处理程序使用队列来允许它使用asyncio。

class RequestsHandler(logging.Handler):
    def __init__(self, loop):
        self._queue = queue.Queue
        loop.create_task(self._drain_loop())

    def emit(self, record):
        log_entry = self.format(record)
        self._queue.put(log_entry)

    async def _drain_loop(self):
        while True:
            log_entry = self._queue.get()
            payload = {
                'text': log_entry
            }
            await requests.post(
                'https://example.com/foo/bar',
                data=payload)

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = RequestsHandler(loop=asyncio.get_event_loop())
handler.setLevel(logging.INFO)
logger.addHandler(handler)

但是,当我运行logger.info('a log message')时,它返回:

Exception has occurred: AttributeError
'RequestsHandler' object has no attribute 'filters'

2 个答案:

答案 0 :(得分:0)

您的RequestHandler构造函数应调用logging.Handler构造函数。

class RequestsHandler(logging.Handler):
    def __init__(self, loop):
        logging.Handler.__init__(self)
        ...

依次调用Filterer构造函数,该构造函数将filters属性初始化为空列表。

答案 1 :(得分:0)

同意Bills的答案,但是我建议您将正确的继承函数与函数super()一起使用

class RequestHandler(logging.Handler):
    def __init__(self, loop):
        super(RequestHandler, self).__init__()

在空的__init__()中,您可以使用参数level定义处理程序的级别,例如。 level = logging.WARNING ...