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

如何用TimedRotatingFileHandler自定义日志文件时间戳命名格式?

解决TimedRotatingFileHandler自定义日志文件名格式问题

你的问题出在TimedRotatingFileHandler默认的滚动命名逻辑上:它会把当前写入的日志文件作为基础名,滚动归档时给文件名追加时间后缀,导致生成初始文件名.时间戳的格式,和你期望的时间戳_.log不符。

不用在午夜重置handler,这个方案确实繁琐不优雅,利用handler的namer属性就能完美解决——这个属性允许你自定义滚动后日志文件的命名规则。

修改后的完整代码

import logging
from logging.handlers import TimedRotatingFileHandler
import os
import re
import time

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
logger.handlers.clear()  # 避免重复添加handler

log_dir = 'logs'
os.makedirs(log_dir, exist_ok=True)  # 确保日志目录存在

# 初始日志文件名简化为临时名称,滚动时由namer处理最终命名
log_file = os.path.join(log_dir, 'temp.log')

# 配置按秒滚动的日志处理器,保留0个备份(直接重命名而非保留备份)
handler = TimedRotatingFileHandler(
    log_file,
    when='s',
    interval=1,
    backupCount=0,
    encoding='utf-8'
)
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

# 自定义namer函数,转换滚动后的文件名格式
def custom_namer(default_name):
    # 默认滚动后的文件名格式:temp.log.2023-08-10_10-05-47
    match = re.search(r'\.(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})$', default_name)
    if match:
        time_str = match.group(1)
        # 将时间格式从YYYY-MM-DD_HH-MM-SS转为YYYYMMDD-HHMMSS
        formatted_time = time_str.replace('-', '').replace('_', '-')
        # 生成期望的文件名格式
        return os.path.join(log_dir, f'{formatted_time}_.log')
    return default_name

handler.namer = custom_namer
logger.addHandler(handler)

i = 0
while True:
    logger.info(i)
    print(i)
    time.sleep(1)
    i += 1

关键说明

  • 初始文件名简化:用temp.log作为临时基础名,滚动后会被namer函数重命名为对应时间的目标文件,无需提前拼接时间。
  • custom_namer函数:通过正则匹配默认生成的带时间后缀的文件名,提取时间部分并转换格式,最终生成你需要的YYYYMMDD-HHMMSS_.log格式。
  • backupCount=0:保持你原有的设置,此时处理器会在滚动时直接重命名文件,不会保留额外备份。

运行后生成的日志文件将完全符合预期:

20230810-100547_.log
20230810-100548_.log
20230810-100549_.log

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:35:16