Python日志记录-从配置文件配置旋转文件处理程序

问题描述

我有以下配置文件,该文件用于配置python模块中的日志记录,它的问题是它没有将时间戳附加到文件名,现在创建的日志文件是file_handler.log,但是我希望它是file_handler-timestamp.log

{
"version": 1,"disable_existing_loggers": true,"formatters": {
  "simple": {
    "format": "%(asctime)s %(levelname)s %(filename)s %(lineno)s %(message)s","datefmt": "%Y-%m-%d %H:%M:%s"
  }
},"handlers": {
  "file_handler": {
    "level": "INFO","class": "logging.handlers.TimedRotatingFileHandler","formatter": "simple","filename": "error.log","backupCount": 10,"interval" : 1,"when": "s","encoding": "utf8"
  }
},"loggers": { },"root": {
  "handlers": [
    "file_handler"
  ],"level": "DEBUG"
}
}

没有配置的工作代码

import logging
import time
from logging.handlers import RotatingFileHandler
    
logger = logging.getLogger('log_1')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s','%Y-%m-%d %H:%M:%s')
handler = RotatingFileHandler('log' + time.strftime('_%Y%m%d-%H%M') + '.log',maxBytes=2000,backupCount=10)
handler.setFormatter(formatter)
logger.addHandler(handler)

解决方法代码,可在程序启动时动态更新配置

import logging.config
import json
import time

fp = open("sample_config.json")
config = json.load(fp)
fp.close()
config['handlers']['file_handler']['filename'] += time.strftime('_%Y%m%d-%H%M') + '.log'
logging.config.dictConfig(config)

解决方法

timestamp是什么时候?文件何时旋转或何时创建?

如果使用TimedRotatingFileHandler,则在旋转文件时,时间戳会附加到文件名上。

如果要将时间戳附加到日志文件名,则必须子类RotatingFileHandler并修改__init__方法。然后将配置文件“ "class"”中的file_handler项指向您的新类。

这很容易做到,但可能不是您所需要的。 只需将时间戳记附加到旋转后的日志文件名上,或者如果您也需要限制大小,请阅读此answer