日志不会覆盖

时间:2018-09-07 20:29:27

标签: python logging

我正在使用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]

This question提到在处理程序配置中使用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)

我做错了什么?

2 个答案:

答案 0 :(得分:2)

调用处理程序对象的doRollover()将重置文件处理程序以在每次运行之前覆盖旧文件。

Python Logging Handlers - Rotating File Handler

答案 1 :(得分:0)

我最初将logging.handlers.RotatingFileHandler用作记录器配置的原始处理程序类。我这样做是因为我试图将非常小的磁盘上的内存风险降至最低。但是,使用logging.handlers.RotatingFileHandler代替logging.FileHandler似乎会禁用YAML配置文件中的mode: 'w'选项。 linked question中的提问者似乎暗示他认为这可能是问题所在,但发布的答案并未反映出这一点(因此感到困惑)。

使用logging.FileHandler解决了我的问题,允许每次执行都覆盖我的日志文件。我了解改写日志和轮换日志的目的相互之间有一定的冲突,但是我认为,轮转日志所提供的安全性以及所希望的改写日志的便利性将是我的项目的最佳选择。