全局更改记录器模块中的日志文件名

ses*_*aru 1 python logging

我正在将记录器模块与 dictConfig (带有 yaml 文件)一起用于我的应用程序日志记录。但是,我想通过添加日期前缀来全局更改日志文件名(例如:logpath:/foo/bar/file_20150523.log)。

因此,每次启动应用程序时,都会创建一个新的日志文件。

是否可以通过另一种方式在 yaml 文件中执行此操作,或者我需要修改应用程序中的处理程序?

谢谢

Hai*_* Vu 5

这个想法很简单:

  1. 从 YAML 文件读取配置
  2. 找到日志文件的名称
  3. 将日期戳附加到名称部分(而不是扩展部分)
  4. 调用logging.config.dictConfig并传入修改后的配置字典

以下是我用于本示例的 YAML 文件daily_log_file.yaml

version: 1
loggers:
    default_logger:
        handlers: [consoleHandler, fileHandler]
        level: DEBUG
handlers:
    consoleHandler:
        class: logging.StreamHandler
        level: DEBUG
        formatter: brief
    fileHandler:
        class: logging.FileHandler
        formatter: brief
        filename: '/tmp/daily_log_file.log'
        level: DEBUG
formatters:
    brief:
        format: '%(levelname)8s %(message)s'
Run Code Online (Sandbox Code Playgroud)

这是脚本daily_log_file.py

import datetime
import os
import logging
import logging.config
import yaml

def yaml_config(yaml_filename):
    global config_dict
    with open(yaml_filename) as f:
        config_dict = yaml.load(f)

        # Append the date stamp to the file name
        log_filename = config_dict['handlers']['fileHandler']['filename']
        base, extension = os.path.splitext(log_filename)
        today = datetime.datetime.today()
        log_filename = '{}{}{}'.format(
            base,
            today.strftime('_%Y%m%d'),
            extension)
        config_dict['handlers']['fileHandler']['filename'] = log_filename

        # Apply the configuration
        logging.config.dictConfig(config_dict)

if __name__ == '__main__':
    yaml_config('daily_log_file.yaml')
    logger = logging.getLogger('default_logger')
    logger.debug('debug message')
    logger.info('info message')
Run Code Online (Sandbox Code Playgroud)

讨论

  • yaml_config是行动所在。我首先从 YAML 文件加载配置字典,然后修补文件名
  • 为了修补文件名,我将基本文件名和扩展名分开
  • 然后,我获取今天的日期并将时间戳附加到文件名,然后将结果分配回配置字典
  • 最后我打电话dictConfig来完成工作