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

如何基于Python logging实现每日生成独立日志文件?

每日独立日志文件实现方案

你的问题出在:初始化日志系统时创建了绑定到当日文件的FileHandler,之后只是重新赋值了log_file变量,但没有更新日志处理器——日志模块依然在使用最初创建的那个FileHandler,所以新日志还是会写入旧文件。

下面提供两种可行的实现方式:

方式一:手动检查日期并切换处理器

适合简单场景,手动控制文件切换逻辑:

import logging as log
import sys
from datetime import datetime

def get_today_log_filename():
    return f'{datetime.now().strftime("%m.%d.%Y")}.log'

# 初始化日志系统
log_sh = log.StreamHandler(sys.stdout)
current_log_file = get_today_log_filename()
log_fh = log.FileHandler(current_log_file)
log_format = '[%(asctime)s] %(levelname)s: %(message)s'
# 注意用%(asctime)s而不是固定的datetime.now(),否则日志时间都是初始化时间
log.basicConfig(format=log_format, level='INFO', handlers=[log_sh, log_fh])

def update_log_handler():
    global current_log_file, log_fh
    new_log_file = get_today_log_filename()
    if new_log_file != current_log_file:
        # 移除旧的文件处理器
        log.root.removeHandler(log_fh)
        log_fh.close()
        # 创建新的文件处理器并添加
        log_fh = log.FileHandler(new_log_file)
        formatter = log.Formatter(log_format)
        log_fh.setFormatter(formatter)
        log.root.addHandler(log_fh)
        current_log_file = new_log_file

# 测试
log.info('test text')
# 模拟次日场景(实际运行时会自动检测日期)
update_log_handler()
log.info('next day test text')

方式二:使用TimedRotatingFileHandler(推荐)

这是logging模块内置的按时间轮转日志的处理器,无需手动判断日期,自动完成每日切分:

import logging as log
from logging.handlers import TimedRotatingFileHandler
import sys
import re

# 设置日志格式
log_format = '[%(asctime)s] %(levelname)s: %(message)s'
formatter = log.Formatter(log_format)

# 控制台处理器
log_sh = log.StreamHandler(sys.stdout)
log_sh.setFormatter(formatter)

# 按日期轮转的文件处理器
# when='midnight'表示每天午夜切换日志
# backupCount=7表示保留最近7天的日志
log_fh = TimedRotatingFileHandler(
    filename='app.log',
    when='midnight',
    interval=1,
    backupCount=7,
    encoding='utf-8'
)
log_fh.setFormatter(formatter)
# 设置日志文件名后缀格式,匹配需求的%m.%d.%Y.log
log_fh.suffix = "%m.%d.%Y.log"
# 调整匹配规则适配自定义后缀
log_fh.extMatch = re.compile(r"^\.\d{2}\.\d{2}\.\d{4}\.log$")

# 配置日志系统
log.basicConfig(level='INFO', handlers=[log_sh, log_fh])

# 测试
log.info('test text')
# 次日程序运行时会自动写入新的日期命名的日志文件
log.info('next day test text')

这种方式更稳定,适合长期运行的服务,还能自动保留指定天数的旧日志,无需手动维护文件切换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:16