Добавить фильтр в цветные журналы - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь использовать цветные логи для добавления цвета в консоль. Таким образом, код создает StreamHandler для консоли и добавляет фильтр. Это само по себе работает. НО цветные журналы добавляют еще один дубликат вывода, который не фильтруется. Кажется, он проходит через sys.err, но фильтр его не перехватывает.

Как добавить фильтр в файл цветного журнала?

import logging
from func import std_func
import sys
import coloredlogs


class BlockFilter(logging.Filter):

    def filter(self, record):
        allow = True

        if record.msg.startswith('Hello'):
            allow = False

        return allow


def std_func(val):
    log = logging.getLogger('')
    log.warning('Hello world.')

    return val * 2.0


def config_logging():

    block_filter = BlockFilter()

    sh = logging.StreamHandler(sys.stdout)
    sh.addFilter(block_filter)
    sh.setLevel(logging.INFO)

    logger = logging.getLogger('')  # root logger
    logger.addHandler(sh)


def main():

    config_logging()
    coloredlogs.install(logger=logging.getLogger(''))

    result = std_func(3.12)
    print(result)


if __name__ == "__main__":

    main()

Вывод из журнала цветного журнала всегда содержит «Привет мир», который я пытаюсь отфильтровать. Есть идеи?

1 Ответ

1 голос
/ 11 февраля 2020

Это потому, что coloredlogs.install() удаляет предыдущий обработчик и заменяет его на пользовательский. Если вы хотите иметь фильтр, вам нужно добавить его в этот обработчик после вызова установки. В следующем коде показан рабочий пример:

import coloredlogs
import logging

class BlockFilter(logging.Filter):
    def filter(self, record):
        return not record.msg.startswith('Hello')

coloredlogs.install()

for handler in logging.getLogger().handlers:
    handler.addFilter(BlockFilter())

logging.warning('Hello this is blocked')
logging.warning('this is shown')

В целом: logging.getLogger() и logging.getLogger('') одинаковы, а coloredlogs.install() по умолчанию использует аргумент регистратора для регистратора root.

...