故障表现

配置好 logging 后每条日志在控制台出现两次,格式还一模一样,排查时误以为任务执行了两遍。

问题出在哪

logger 自己加了 handler,又通过 propagate 把记录传给 root,root 上还有一份控制台 handler。判断时先分清是 Python 日志重复 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

按这个顺序处理

  1. 确认 logger 的 handler 数量
  2. 关闭 propagate 或只保留一处 handler
  3. 封装统一的初始化函数避免重复调用

对应的命令或配置片段如下,可直接复制:

import logging
log = logging.getLogger('app')
log.setLevel(logging.INFO)
log.propagate = False
if not log.handlers:
    h = logging.StreamHandler()
    h.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    log.addHandler(h)

不要一次改多个参数,每次只动一处并记录下来,否则现象变了也说不清是哪个改动起的作用。改完只在一台机器上验证不够,至少从外网和移动网络各试一次,才能确认不是本地缓存造成的假象。

怎么确认改好了

再执行一次任务,控制台每条日志只出现一次,行数与实际流程一致。

作者 9823189