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
相关产品推荐
相关产品推荐

