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

Python中如何重置root logger配置解决多余日志文件生成问题

问题根因
  • 你首次调用logging.basicConfig(filename='logs/example.log')时,已经给进程级全局的根日志器添加了指向example.log的文件处理器,logging的配置是进程全局生效的,只要进程不退出,配置就会一直保留
  • 你当前代码只移除了根日志器的handler,但没有显式关闭被移除的handler,文件句柄可能残留。同时你自定义的日志器默认开启了propagate属性,日志会向上传递到根日志器,如果根日志器的handler被意外恢复,就会继续写example.log
  • 如果你在类似Jupyter、Flask调试模式这类常驻进程/支持热重载的环境中运行代码,旧的配置不会随代码重跑自动清空,就会每次都生成遗留的日志文件
完整重置方案

修改后可直接生效的代码如下:

import logging
import logging.handlers
import os

# 第一步:放在所有业务逻辑、模块导入最前面,先全局重置logging模块,清掉所有旧配置
root_logger = logging.getLogger()
# 先关闭所有旧handler释放文件资源,再移除
for handler in root_logger.handlers[:]:
    handler.close()
    root_logger.removeHandler(handler)
# 可选简化方案:用下面这行代替上面的循环,force参数会强制覆盖所有旧配置
# logging.basicConfig(force=True, handlers=[])

LOG_FILENAME = 'logs/app.log'
# 提前创建日志目录避免运行报错
os.makedirs(os.path.dirname(LOG_FILENAME), exist_ok=True)

# 创建自定义日志器
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# 关键配置:禁止日志向上传递到根日志器,彻底避免触碰到根日志器的遗留配置
logger.propagate = False

# 创建文件处理器
fh = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=250000, backupCount=5)
fh.setLevel(logging.INFO)

# 设置日志格式
ffh = logging.Formatter('%(asctime)s : %(name)-12s : %(levelname)-8s : %(message)s')
fh.setFormatter(ffh)

# 给自定义日志器绑定处理器
logger.addHandler(fh)

logger.info('instance logger')
额外注意事项
  • 如果是单次运行的独立脚本,每次运行都是新进程还会生成example.log,说明你导入的某个依赖模块在初始化阶段就调用了带filename='logs/example.log'的basicConfig,只要把上面的重置逻辑放到代码最开头(所有import语句之前)即可解决
  • 后续日志配置尽量都绑定到自己创建的命名日志器,不要随意修改logging全局属性或者根日志器的配置,能避免绝大多数配置冲突问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 19:45:06