如何基于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
相关产品推荐
相关产品推荐

