Python: обработчик журналирования только журнал уровня журнала меньше, чем ERROR - PullRequest
0 голосов
/ 17 мая 2018

Мне нужен способ для регистратора Python не регистрировать ОШИБКУ или выше. Это нужно только для регистрации меньше, чем ОШИБКА.

import logging
from logging import StreamHandler

def get_log_formatter():
    datefmt = '%b %d %y %H:%M:%S'
    formatter = logging.Formatter('%(asctime)s [%(module)s:%(levelname)s] %(message)s',
                          datefmt=datefmt)
    return formatter

class MyHandler(StreamHandler):
    def __init__(self, max_level, *args, **kwargs):
        super(MyHandler, self).__init__(*args, **kwargs)
        self.max_level = max_level
    def emit(self, record):
        if record.levelno >= self.max_level:
            return
        return super(MyHandler, self).emit(record)

handl = MyHandler(logging.ERROR)
handl.setLevel(logging.INFO)
handl.setFormatter(get_log_formatter())
logger = logging.getLogger("testing_logger")
logger.addHandler(handl)
logger.setLevel(logging.INFO)

Кажется, это работает, но имеет ли это смысл? Есть ли лучший способ отфильтровать логлайн?

In [3]: logger_num = 0

In [4]: logger = remake()

In [5]: logger.info("Why")
May 16 01 16:50:10 [<ipython-input-5-c350362291ad>:INFO] Why

In [6]: logger.warn("Why")
May 16 01 16:50:13 [<ipython-input-6-56809439d5a4>:WARNING] Why

In [7]: logger.error("Why")

In [8]:

1 Ответ

0 голосов
/ 06 июня 2018

Недостатком вашего решения является то, что вам придется создавать подклассы для каждого обработчика, который вы хотите использовать.

Фильтр контекста гораздо понятнее в своем намерении:

class MaxFilter:
    def __init__(max_level):
        self.max_level = max_level

    def filter(self, record):
        if record.levelno < self.max_level:
            return True

И может применяться к любому обработчику как таковому:

any_concrete_handler.addFilter(MaxFilter(logging.INFO))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...