FileHandler в журнале конфигурации файла редкого поведения

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

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 ответ

Решение

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

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

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

Другие вопросы по тегам