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

Python程序重运行时如何避免logging日志文件被重写覆盖

日志文件被重复覆盖的问题排查与修复

核心根因

你的原有判断逻辑完全无法阻止日志被覆盖,问题出在两个代码实现细节上:

  • 业务流程中反复以覆盖模式初始化日志:你在move_file函数的两个执行分支里,每次触发文件移动操作时,都会重新调用logging.basicConfig,且固定传入filemode="w"。这个参数代表以截断覆盖的方式打开日志文件,甚至不需要重跑程序,只要在单次运行过程中触发一次文件移动操作,文件内的所有历史内容就会被瞬间清空。
  • 启动阶段的判断逻辑完全被后续操作绕过:你在程序入口处编写的Path('app.log').is_file()判断,只在程序启动阶段执行了一次,但后续业务事件中反复触发的日志配置,完全不受这个分支的约束。同时你在每次重新配置日志前调用了logging.shutdown(),会强制清理已有的日志处理器,让后续的basicConfig每次都能成功重置为覆盖模式,进一步放大了文件覆盖的问题。

修复方案

日志配置只需要在程序启动阶段做一次性初始化,所有业务流程里的重复配置逻辑全部删除即可:

  • 移除启动阶段判断app.log是否存在的if分支,该逻辑没有实际作用:追加写入模式下,程序会自动处理文件不存在时的创建、文件存在时的追加写入,不需要手动做文件存在判断。
  • 将全局日志配置的filemode参数从"w"修改为"a",以追加模式写入日志,保留所有历史内容。
  • 删除move_file函数内所有重复调用logging.basicConfig、logging.shutdown()的代码,日志初始化不需要在业务事件中反复触发。

正确的全局日志配置示例

import logging
from pathlib import Path

# 程序启动时仅执行一次的日志配置
logging.basicConfig(
    filename='app.log',
    filemode="a",  # 追加写入,不会清空历史日志
    format='%(asctime)s, log level: %(levelname)s, log content: %(message)s',
    level=logging.DEBUG
)

易踩坑提醒

  • logging.basicConfig是一次性初始化接口:如果日志系统已经挂载了文件处理器,后续再调用该接口不会产生任何配置变更,绝对不要将其写在按钮响应、循环等业务逻辑中反复调用。
  • 不要随意在业务流程中调用logging.shutdown():该接口的作用是强制刷新日志缓冲区、清理所有日志处理器,通常只需要在程序退出前调用一次,中途调用会意外重置日志配置。
  • 需要保留历史日志时,绝对不能使用filemode="w",该参数会在文件打开的瞬间直接清空所有原有内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 11:24:01