日志「重复输出」有好几种完全不同的原因:handler 重复、模块在多个进程里各跑一次、开发服务器的 reloader。多进程写同一个日志文件还可能丢日志。这篇用真实的进程把每种情况分开验证(日志基础见第 181 篇)。
只在 app logger 上加 handler(根 logger 没有) → 输出 1 次 根 logger 有 handler 且 app logger 也加了 → 输出 2 次 两处都有 handler,但 app logger 关了 propagate → 输出 1 次 初始化函数被调用了 3 次(每次都 addHandler) → 输出 3 次 同上,但加之前判断 handlers 是否已存在 → 输出 1 次
上一篇:环境变量注入;下一篇:生产环境 DEBUG=False。
默认(每个 worker 自己导入应用):顶层日志 3 行,pid ['76051', '76052', '76061'] --preload(master 导入一次再 fork):顶层日志 1 行,pid ['76069']
顶层日志 2 行,pid ['76077', '76080'](reloader 的父进程和子进程各导入了一次)
FileHandler(追加模式):文件 1 个,完整的行 9000 / 9000,损坏的行 0 RotatingFileHandler(maxBytes=20000,备份保留 200 个,保证不会因备份满而丢):文件 34 个,完整的行 8215 / 9000,损坏的行 0