You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python日志配置:如何让配置文件生成带时间戳的日志文件名

如何在Python日志配置中直接生成带时间戳的日志文件名?

问题描述

我目前通过JSON配置文件配置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"
  }
}

我已经掌握了不使用配置文件的写法,以及启动时动态修改配置的临时方案,但希望找到无需修改配置文件内容,直接通过配置逻辑实现的方法。

解决方案:自定义日志Handler类

核心思路是自定义一个继承自目标Handler的子类,在初始化阶段自动为文件名添加时间戳,然后在配置文件中指定这个自定义类的路径即可。

步骤1:编写自定义Handler类

创建一个Python模块(比如命名为custom_log_handlers.py),定义如下类:

import time
from logging.handlers import TimedRotatingFileHandler

class TimestampedTimedRotatingFileHandler(TimedRotatingFileHandler):
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
        # 生成指定格式的时间戳
        timestamp = time.strftime('_%Y%m%d-%H%M')
        # 处理文件名,保留原扩展名并插入时间戳
        if '.' in filename:
            name_part, ext_part = filename.rsplit('.', 1)
            timestamped_filename = f"{name_part}{timestamp}.{ext_part}"
        else:
            timestamped_filename = f"{filename}{timestamp}"
        # 调用父类初始化方法,传入处理后的文件名
        super().__init__(timestamped_filename, when, interval, backupCount, encoding, delay, utc, atTime)

这个类会在初始化时自动将时间戳插入到原文件名中,同时保留原文件的扩展名。

步骤2:修改配置文件

将配置中handlers.file_handler.class的值替换为自定义类的完整模块路径(比如custom_log_handlers.TimestampedTimedRotatingFileHandler):

{
  "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": "custom_log_handlers.TimestampedTimedRotatingFileHandler",
      "formatter": "simple",
      "filename": "error.log",
      "backupCount": 10,
      "interval" : 1,
      "when": "s",
      "encoding": "utf8"
    }
  },
  "loggers": { },
  "root": {
    "handlers": [ "file_handler" ],
    "level": "DEBUG"
  }
}

步骤3:加载配置并测试

在主程序中直接加载配置文件即可:

import logging.config
import json

with open("sample_config.json") as fp:
    config = json.load(fp)
logging.config.dictConfig(config)

# 测试日志输出
logger = logging.getLogger()
logger.info("This is a test log message")

启动程序后,会自动生成类似error_20240520-1430.log的带时间戳日志文件,无需在代码中动态修改配置内容。

补充说明

  • 若需要其他格式的时间戳,修改time.strftime的参数即可,比如_%Y-%m-%d_%H-%M-%S可以生成更精细的时间戳。
  • 如果使用的是RotatingFileHandler而非TimedRotatingFileHandler,只需让自定义类继承RotatingFileHandler,初始化逻辑保持一致即可。

内容的提问来源于stack exchange,提问作者Infinite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:49