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

时间:2015-05-23 19:57:19

标签: python logging

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

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

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

感谢名单

1 个答案:

答案 0 :(得分:3)

这个想法很简单:

  1. 从YAML文件中读取配置
  2. 找到日志文件的名称
  3. 将日期戳附加到名称部分(不是扩展部分)
  4. 调用logging.config.dictConfig并传入修改后的配置字典
  5. 以下是我用于此示例的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'
    

    以下是脚本 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')
    

    讨论

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