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
相关产品推荐
相关产品推荐

