Логи не перезаписываются - PullRequest
0 голосов
/ 07 сентября 2018

Я использую модуль Python logging.config для настройки и использования инструмента ведения журнала в моем проекте.

Я хочу, чтобы мои файлы журналов перезаписывались каждый раз (не добавлялись), поэтому я установил свой файл конфигурации YAML следующим образом:

# logging configuration file

version: 1
disable_existing_loggers: False

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

handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple
        stream: ext://sys.stdout

    info_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: INFO
        formatter: simple
        filename: .logs/info.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8
        mode: 'w'

    error_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: ERROR
        formatter: simple
        filename: .logs/errors.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8
        mode: 'w'

loggers:
    my_module:
        level: ERROR
        handlers: [console]
        propagate: no

root:
    level: INFO
    handlers: [console, info_file_handler, error_file_handler]

В этом вопросе упоминается, что использование mode: w в конфигурации обработчика должно выполнить то, что я хочу, но файлы журнала продолжают добавляться в любом случае. Вот мой код конфигурации:

def logging_setup(cfg_path=definitions.LOG_CONFIG_PATH, def_lvl=logging.INFO):
    """Setup logging tool from YAML configuration file."""

    # create directory for log files if not already there
    try:
        os.makedirs(definitions.LOGS_PATH)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise

    # configure logging from yaml config file
    if os.path.exists(cfg_path):
        with open(cfg_path, 'rt') as f:
            config = yaml.load(f.read())

        logging.config.dictConfig(config)

    else:
        logging.basicConfig(level=def_lvl)

Что я делаю неправильно?

1 Ответ

0 голосов
/ 10 сентября 2018

Я изначально использовал logging.handlers.RotatingFileHandler в качестве исходного класса обработчика для моей конфигурации регистратора. Я сделал это, потому что я пытаюсь минимизировать возможные риски памяти на очень маленьком диске. Однако: использование logging.handlers.RotatingFileHandler вместо logging.FileHandler, по-видимому, отключает параметр mode: 'w' в файле конфигурации YAML. Задаваемый вопрос в связанном вопросе , похоже, предполагает, что он считает, что это может быть проблемой, но опубликованные ответы не отражают это (таким образом, мое замешательство).

Использование logging.FileHandler решает мою проблему, позволяя моим файлам журналов перезаписываться при каждом выполнении. Я понимаю, что перезаписываемые журналы и ротационные журналы служат целям, которые находятся в некотором противоречии друг с другом, но я подумал, что для моего проекта лучше всего было бы обеспечить безопасность, которую предлагают ротационные журналы с желаемым удобством перезаписанных журналов.

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