Вход в систему python с YAML и фильтром - PullRequest
0 голосов
/ 27 апреля 2020

Хотите настроить регистратор с фильтром, используя YAML.

Файл конфигурации YAML config.yaml выглядит следующим образом:

version: 1

formatters:
  simple:
    format: "%(asctime)s %(name)s: %(message)s"
  extended:
    format: "%(asctime)s %(name)s %(levelname)s: %(message)s"

filters:
  noConsoleFilter:
    class: noConsoleFilter

handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: simple
    filters: [noConsoleFilter]

  file_handler:
    class: logging.FileHandler
    level: INFO
    filename: test.log
    formatter: extended

root:
  handlers: [console, file_handler]
  propagate: true

... и основная программа в main.py выглядит следующим образом:

import logging.config
import yaml

class noConsoleFilter(logging.Filter):
    def filter(self, record):
        print("filtering!")
        return not (record.levelname == 'INFO') & ('no-console' in record.msg)

with open('config.yaml', 'r') as f:
    log_cfg = yaml.safe_load(f.read())
    logging.config.dictConfig(log_cfg)  

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info("no-console. Should not be in console, but be in test.log!")
logger.info('This is an info message')
logger.error('This is an error message')

Ожидаемый результат в консоли без сообщения «no-console»:

   2020-04-27 18:05:26,936 __main__: This is an info message 
   2020-04-27 18:05:26,936 __main__: This is an error message

Но выглядит как класс: noConsoleFilter даже не рассматривается, так как оператор print также не работает.

Где я ошибаюсь? Как я могу это исправить?

...