配置自定义Logger后Waitress仍输出重复日志问题咨询
排查思路
- 确认重复日志的实际归属:在
CustomFormatter的format方法中临时增加print(record.name)逻辑,判断重复日志是否来自未被捕获的waitress子级logger(如waitress.channel、waitress.server),还是根logger默认处理器导致的重复输出 - 检查配置执行顺序:确认是否存在日志配置完成后,Flask初始化、第三方依赖调用
logging.basicConfig的逻辑,该操作会给根logger新增默认StreamHandler,导致日志同时从自定义处理器和根处理器输出,出现重复现象 - 核查根logger配置:打印
logging.root.handlers确认是否存在未被清空的默认处理器,这是绝大多数Python日志重复问题的根源
可行解决方案
- 批量禁用所有waitress、werkzeug相关logger
你当前仅配置了waitress、werkzeug的根logger,未覆盖其下的子logger,新增如下代码批量禁用所有相关logger:
for logger_name in logging.root.manager.loggerDict: if logger_name.startswith("waitress") or logger_name.startswith("werkzeug"): target_log = logging.getLogger(logger_name) target_log.disabled = True target_log.propagate = False
- 清空根logger默认配置
在所有日志配置逻辑的最开头,先清空根logger的默认处理器,避免兜底输出:
# 清空根logger所有默认处理器 logging.root.handlers = [] # 根logger级别设为最高,避免捕获未匹配的日志 logging.root.setLevel(logging.CRITICAL)
- 启动Waitress时显式关闭日志输出
调用Waitress的serve方法时,直接传入参数关闭其内置日志输出,优先级高于logger配置:
from waitress import serve serve(app, log_socket_errors=False, _quiet=True)
注:_quiet是Waitress内置的非公开参数,可直接关闭默认的访问日志、错误日志输出
- 调整配置执行顺序
将日志配置顺序调整为:先清空根logger默认配置 → 再禁用第三方库logger → 最后初始化自定义应用logger,避免配置被后续逻辑覆盖。
内容的提问来源于stack exchange,提问作者jlarks32
相关产品推荐
相关产品推荐

