本文目录导读:

Loguru 和 Python 标准库 logging 相比,最大的优势在于 “开箱即用” 和 “零样板代码”,如果你厌倦了 logging 繁琐的配置(Handler、Formatter、Filter),Loguru 几乎是“ICU”级别的救星。
下面从几个核心维度对比它们的好坏:
配置复杂度
-
standard logging:需要手动创建 Logger、Handler、Formatter,并设置级别。
import logging # 标准库需要多行代码 logger = logging.getLogger("my_app") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Hello") -
Loguru:一行代码搞定。
from loguru import logger logger.info("Hello") # 自带颜色、时间、调用位置胜出点:无需模板代码,
import即可用。
格式化与模板
- standard logging:格式化依赖
%(name)s、%(levelname)s等占位符,很笨重,要输出调用文件和行号,需要额外配置。 - Loguru:默认自带 颜色高亮、时间戳、函数名、行号。
logger.info("User {} logged in from {}", user.name, request.ip) # 自动格式化无需手动拼字符串,传入参数即可,而且还支持 风格(类似
.format()),比 风格更可读。
异常与回溯
-
standard logging:异常回溯默认是一行,很丑,如果想捕获异常堆栈,需要手动设置
exc_info=True。logger.error("Failed", exc_info=True) -
Loguru:自动捕获异常,并且输出漂亮的彩色回溯,显示局部变量。
@logger.catch() # 装饰器,自动捕获并记录 def dangerous_function(): 1 / 0只需一个装饰器就能完整记录异常栈和上下文,这在生产排错时非常强大。
动态级别与过滤
- standard logging:过滤通常需要写 Filter 类,比较繁琐。
- Loguru:直接支持 **lambda 过滤 和 Level 动态绑定。
# 仅记录 DEBUG 级别且包含 "DB" 的日志 logger.add("file.log", filter=lambda record: "DB" in record["message"]) # 动态修改某个 sink 的级别 logger.add("debug.log", level="DEBUG")
多 Sink 支持
- standard logging:需要手动实例化
FileHandler、RotatingFileHandler等。 - Loguru:
add()方法直接支持控制台、文件、网络、队列、TCP、UDP 等。logger.add("file_{time}.log", rotation="500 MB") # 自动轮转 logger.add(sys.stdout, colorize=True) logger.add("error.log", level="ERROR", retention="10 days") # 自动删除旧日志rotation和retention是内置参数,无需手动配置时间轮转逻辑。
序列化与结构化
- standard logging:支持 JSON 序列化但需要额外代码。
- Loguru:内置
serialize=True输出 JSON,适合对接 ELK 或日志分析系统。logger.add("log.json", serialize=True) # 每行一个 JSON 对象
多进程/异步支持
- standard logging:多进程写入容易乱序或丢失。
- Loguru:提供了
enqueue=True参数,自动将日志放入队列,由后台线程写入,保证多进程安全。logger.add("file.log", enqueue=True) # 线程/进程安全
性能
- standard logging:在配置复杂时开销较大。
- Loguru:底层的日志核心使用 C 扩展(通过
better_exceptions和优化的 I/O),在高并发下通常比标准库快,不过对于极高频的日志(如每秒百万条),Loguru 的默认装饰器(如@logger.catch)会比标准库稍重,但大多数业务系统远达不到这个量级。
什么时候用 Loguru 更好?
- 中小型项目、脚本、微服务、数据分析:不想写样板代码,希望快速上线。
- 开发调试:颜色、行号、局部变量捕获对开发效率提升巨大。
- 需要美观的可视化日志:比如在 Jupyter Notebook 或终端中。
什么时候用 standard logging 更好?
- 大型企业项目,已经有成熟日志体系(如
logstash、graylog),且遵循标准接口(logging是标准库,兼容性最强)。 - 严格依赖标准库,不想引入第三方依赖(如某些安全受限环境)。
- 需要对日志进行细粒度控制,比如复杂的 Handler 链、自定义 Filter、与 Django/Flask 的默认日志系统深度集成(虽然 Loguru 也支持 patch)。
总结表
| 维度 | standard logging | Loguru |
|---|---|---|
| 上手难度 | 中等(需配置 Handler/Formatter) | 极低(import 即用) |
| 格式化 | 风格,默认无颜色 | 风格,彩色、自动含行号 |
| 异常回溯 | 手动设置 exc_info |
自动捕获,显示局部变量 |
| 文件轮转 | 手动 RotatingFileHandler |
一行 rotation 参数 |
| 多进程安全 | 需额外加锁 | enqueue=True |
| 过滤 | 写 Filter 类 | Lambda 表达式 |
| 性能 | 中等 | 通常更快(C 扩展) |
| 依赖 | 标准库,无依赖 | 需要 pip 安装,仅 1 个依赖 |
一句话总结:Loguru 在“易用性”、“可读性”、“调试友好度”上完胜标准库;如果你不需要与标准库生态深度绑定,Loguru 是更好的选择。