FileHandler в журнале конфигурации файла редкого поведения - PullRequest
0 голосов
/ 03 января 2019

У меня есть файл конфигурации регистрации:

logger_config.yml

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
  file:
    class: logging.FileHandler
    level: DEBUG
    formatter: simple
    filename: train.log
loggers:
  trainLogger:
    level: DEBUG
    handlers: [console]
    propagate: 1
root:
  level: DEBUG
  handlers: [console]
  propagate: 1

И простой скрипт:

test.py

import logging
import logging.config
import yaml


with open('logging_config.yml', 'rt') as f:
    config = yaml.safe_load(f.read())

logging.config.dictConfig(config)

# create logger
logger = logging.getLogger(__name__)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

Когда я запускаю test.py, предполагается, что скрипт просто войдет в консоль, поскольку handler для root равно console, но также создается пустой файл train.log. Почему это приложение?

1 Ответ

0 голосов
/ 03 января 2019

Вы создаете fileHandler при загрузке своего экземпляра регистратора, даже если вы только используете consoleHandler. Если вы просто запустите в оболочке следующее:

import logging
fh = logging.FileHandler("mylogger.txt")
quit()

Вы увидите, что "mylogger.txt" создан. Это потому, что за кулисами обработчик создает файл при __init__, а не во время использования. Это лучше спроектировать таким образом, так как вы могли бы использовать этот обработчик несколько раз, возможно, в одно и то же время, и вы не хотите проверять наличие файла каждый раз, так как это будет медленно и Вы можете ввести условие гонки при попытке создать файл

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