loguru 日志重复因多次 add() 未 remove;rotation 需配合 enqueue=true 防丢失;异常堆栈应仅 error 级启用 backtrace=true 并分离文件/控制台配置;避免滥用 .bind(),推荐 handler 分离、级别隔离与初始化收敛。

Loguru 能让日志管理变简单,但直接替换 logging 模块后出现重复日志、异步写入丢失、或 rotation 不生效——这些问题不是配置写错了,而是没理解 Loguru 的默认行为和生命周期。
为什么刚用 Loguru 就看到双倍日志?
这是最常踩的坑:脚本里调用了 logger.add() 多次(比如在循环里、或被多次 import 的模块中反复初始化),而 Loguru 默认会保留所有 handler。结果每加一次就多一条输出通道。
- 检查是否在函数内、或被反复导入的模块顶部执行了
logger.add() - 改用
logger.remove()清空已有 handler,再logger.add()——尤其适合测试环境重载时 - 生产环境建议只在入口文件(如
main.py)顶部初始化一次,避免分散添加
如何让日志按大小轮转且不丢数据?
rotation 参数看似简单,但搭配 enqueue=True 才真正安全。不加 enqueue 时,日志写入由主线程同步完成;一旦程序崩溃或强制退出,最后几条日志大概率丢失。
-
rotation="100 MB"或rotation="1 week"都有效,但注意:文件大小是“达到后新建”,不是“超过才切” - 必须配
enqueue=True启用队列机制,否则rotation在高并发下可能出错或阻塞 - 如果用
compression="zip",确保系统已安装zlib,Windows 上某些精简版 Python 可能缺失
怎么把异常堆栈完整记进文件,又不让控制台刷屏?
Loguru 默认把 exception=True 应用于所有日志级别,但你通常只希望 ERROR 级别才记录完整 traceback,同时避免 INFO 日志也带堆栈干扰阅读。
- 不要全局设
logger.add(..., format="{time} {level} {message}", backtrace=True)——backtrace会暴露内部帧,调试有用,上线要关 - 对文件 handler 显式启用
backtrace=True, diagnose=False(减少敏感路径泄露) - 对控制台 handler 设
backtrace=False, diagnose=False,并在logger.error()时手动传exc_info=True
Loguru 的链式调用看着方便,但 .patch() 和 .bind() 容易被滥用——比如在循环里反复 bind(task_id=...) 却没清理,最终日志字段膨胀。真正稳定的日志策略,靠的是 handler 分离 + 级别隔离 + 初始化收敛,而不是靠运行时动态打标。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











