loguru默认已添加sys.stderr handler,故logger.info()通常不报错;若调用过logger.remove()则需显式add(),否则因无活跃handler而静默丢失日志。

Loguru 的默认配置已经能覆盖 80% 的日志需求,但“开箱即用”不等于“无需调整”——关键在于理解哪些配置必须改、哪些可以不动。
为什么直接 logger.info() 会报错?
Loguru 不像 logging 模块那样内置 root logger,它默认不启用任何 handler。调用 logger.info() 前必须至少添加一个输出目标。
- 最简启动方式是
logger.add(sys.stderr)(已默认存在),但如果你删过 handler 或在模块顶部执行了logger.remove(),就会触发No handlers could be found类似错误 - 常见误操作:在封装日志工具时调用
logger.remove()后忘记add(),导致后续所有日志静默丢失 - 验证是否就绪:运行
print(logger._core.handlers),非空列表才表示有活跃 handler
如何让日志自动按天轮转并压缩旧文件?
logger.add() 的 rotation 和 compression 参数必须协同使用,单独设 rotation 不会触发压缩。
- 按天切分:用
rotation="00:00"(推荐)或rotation="1 day";避免用"daily"(已被弃用) - 压缩旧日志:加上
compression="zip"或"tar.gz";注意"gz"不合法,会静默失败 - 保留最近 7 天:
retention="7 days",不是数字 7;单位必须带空格和复数,如"30 minutes"、"1 week" - 示例:
logger.add("logs/app.log", rotation="00:00", compression="zip", retention="7 days")
如何在多进程环境下安全写入同一日志文件?
Loguru 默认不保证跨进程写入安全,多个进程同时 add() 到同一个文件会导致内容错乱或丢失。
- 方案一(推荐):用
enqueue=True启用异步队列,Loguru 内部通过 multiprocessing.Queue 转发日志,主进程消费写入 —— 这是最轻量且可靠的解法 - 方案二:每个进程写独立文件,用
rotation+filter配合进程 ID 区分,例如logger.add(f"logs/app_{os.getpid()}.log", ...) - 不要依赖文件锁(如
delay=True或外部 flock),Loguru 没有集成此类机制,容易死锁或漏写
真正容易被忽略的是上下文传播:Loguru 的 bind() 和 contextvars 集成只在当前协程/线程有效,跨线程池或 spawn 进程时需手动传递 context,否则 request_id、user_id 等绑定字段会消失。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











