Python日志每日生成异常:为何仅生成启动当日日志?
问题根源
logging.basicConfig() 是幂等性的:它只会在第一次被调用时完成日志系统的初始化,后续重复调用不会修改已有的配置。哪怕你在循环里每次都计算新日期并传入不同的filename参数,日志系统也不会切换到新文件,只会持续往脚本启动当日创建的日志文件中写入内容。
解决方案
推荐两种可行的修复方式,按需选择:
方案1:使用内置的TimedRotatingFileHandler(更规范可靠)
这是logging模块专门为按时间分割日志设计的处理器,能自动在指定时间点生成新日志文件,无需手动处理日期判断:
import logging from logging.handlers import TimedRotatingFileHandler import time log_base_path = '/home/test/daily.log' # 配置按天轮转的日志处理器 handler = TimedRotatingFileHandler( filename=log_base_path, when='midnight', # 每天午夜触发日志切换 interval=1, # 轮转间隔为1天 backupCount=7, # 保留最近7天的历史日志 encoding='utf-8' ) # 设置日志格式 formatter = logging.Formatter('%(asctime)s %(message)s') handler.setFormatter(formatter) # 配置根日志器 logger = logging.getLogger() logger.setLevel(logging.DEBUG) logger.addHandler(handler) while True: logger.debug("Main: start script") # 此处替换为你的业务逻辑代码 time.sleep(30)
该方案会自动生成带日期后缀的日志文件(如daily.log.2024-05-20),并自动清理超出保留数量的旧日志,无需手动维护文件切换逻辑。
方案2:手动动态切换日志文件(自定义场景适用)
如果需要完全自定义日志文件命名或切换逻辑,可以每次循环检查日期变化,动态更新日志处理器:
import logging from datetime import date import time from logging import FileHandler log_path = '/home/test/' last_recorded_date = None logger = logging.getLogger() logger.setLevel(logging.DEBUG) while True: current_date = date.today() # 日期变更或首次运行时,切换日志文件 if current_date != last_recorded_date: # 移除并关闭旧的日志处理器,避免资源泄漏 for handler in logger.handlers[:]: logger.removeHandler(handler) handler.close() # 创建新的日志文件处理器 log_file_name = f"{log_path}{current_date}.log" new_handler = FileHandler(log_file_name, encoding='utf-8') new_handler.setFormatter(logging.Formatter('%(asctime)s %(message)s')) logger.addHandler(new_handler) last_recorded_date = current_date logger.debug("Main: start script") # 此处替换为你的业务逻辑代码 time.sleep(30)
这种方式需要手动管理处理器的生命周期,注意必须关闭旧处理器以释放文件资源。
内容的提问来源于stack exchange,提问作者Hans Germardies
相关产品推荐
相关产品推荐

