Объект Python 'RequestsHandler' не имеет атрибута 'filters' - PullRequest
0 голосов
/ 20 октября 2018

Я создал обработчик 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 голосов
/ 04 сентября 2019

Согласен с ответом по Биллу, однако я бы порекомендовал вам правильно использовать функции наследования с функцией super()

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

В пустом __init__() вы можете определить уровень обработчика с помощью параметра levelнапримерlevel = logging.WARNING ...

0 голосов
/ 20 октября 2018

Ваш конструктор RequestHandler должен вызывать конструктор logging.Handler.

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

Это, в свою очередь, вызывает конструктор Filterer, который инициализирует атрибут filters пустым списком..

...