当前位置:首页>python>深入浅出 Loguru:让 Python 日志优雅到飞起

深入浅出 Loguru:让 Python 日志优雅到飞起

  • 2026-10-11 05:52:50
深入浅出 Loguru:让 Python 日志优雅到飞起

深入浅出 Loguru:
让 Python 日志优雅到飞起

还在用 print() 调试、用 logging 被配置劝退?Loguru 会让你明白:打日志原来可以这么简单又好看。


一、为什么需要 Loguru?print 不香吗?

print() 调试在脚本短小的时候确实顺手,但一旦项目变大,它就暴露出一堆问题:分不清正常运行还是出错、没有时间戳、上了生产没法关掉、报错时看不到完整堆栈。等到你想"正经"打日志,不少人会去翻标准库 logging,结果被 logger、handler、formatter、filter 一套组合拳劝退。

Loguru 是 Python 社区里最受欢迎的现代日志库(GitHub 星标 1.9 万+,月下载量数千万),由 Delgan 打造。它把"开箱即用"做到了极致:不需要任何配置就能输出带颜色、带时间、带文件行号的漂亮日志,写文件、滚动切割、异常捕获全自动。

🎯 零配置上手 — from loguru import logger 直接用,没有 handler/formatter 的繁琐 setup。

📝 自动彩色与上下文 — 时间、级别、文件、行号、函数名全自动附带,终端里花花绿绿一目了然。

🪣 文件与滚动切割 — 一行 add() 就能写文件,还能按大小/时间自动切分、压缩、保留最近 N 份。

一句话总结:Loguru = logging 的"傻瓜相机"版本。你要的它都默认帮你做好,需要进阶时又随时能精细控制。

二、安装与第一个彩色日志

安装只需一行:

pip install loguru

无需任何配置,直接感受 Loguru 的威力:

from loguru import logger

logger.debug("这是一条调试信息")
logger.info("服务启动成功 ✅")
logger.warning("磁盘空间不足 20%")
logger.error("数据库连接失败!")
logger.success("任务全部完成")

运行后你会看到:每条日志前面自动带上了时间、级别(带颜色)、文件名:行号:函数名。INFO 是白色、SUCCESS 是绿色、WARNING 是黄色、ERROR 是红色——眼睛一下就能抓住重点。完全不需要像 logging 那样先配 basicConfig。

💡 小技巧:Loguru 的 logger 是个全局单例,任何模块里 from loguru import logger 拿到的都是同一个对象,配置一次全局生效。

三、核心 API:logger 与日志级别

Loguru 内置 7 个级别,从低到高:TRACE(5) < DEBUG(10) < INFO(20) < SUCCESS(25) < WARNING(30) < ERROR(40) < CRITICAL(50)。注意它比标准库多了 TRACE 和 SUCCESS 两个级别,非常实用。

用 logger.level() 控制显示门槛——低于该级别的日志不会输出:

from loguru import logger

logger.remove()              # 清空默认 handler
logger.add(sys.stderr, level="INFO")   # 只显示 INFO 及以上

logger.debug("看不见我")      # 被过滤
logger.info("能看到我")       # 输出

日志还支持 结构化参数,用大括号占位,比 f-string 更安全(生产环境关闭时不会做无谓拼接):

user = "Alice"
logger.info("用户 {} 登录成功", user)
logger.bind(order_id=1024).info("订单处理中")

四、写文件 + 自动滚动切割(最爽的功能)

标准库要写文件、按大小切割,得配 RotatingFileHandler 或 TimedRotatingFileHandler,代码又臭又长。Loguru 一行搞定:

from loguru import logger

# 写入 app.log,超过 10MB 自动切一个新文件,最多保留 3 份并压缩
logger.add(
    "app.log",
    rotation="10 MB",
    retention=3,
    compression="zip",
    encoding="utf-8",
    enqueue=True,        # 异步写入,不阻塞主线程
    backtrace=True,      # 记录完整异常链
    diagnose=True,       # 显示变量值,便于排错
)

几个关键参数:

rotation — 切割触发条件:"500 MB"、"1 week"、"00:00"(每天零点)、甚至一个回调函数。

retention — 保留策略:"10 days"、5(保留最新 5 个文件)。

enqueue=True — 强烈推荐!日志写入放到独立线程,Web 服务高并发时不会拖慢接口响应。

五、自定义日志格式

默认格式已经很够用,但想要 JSON 格式(方便 ELK、Loki 等日志系统收集)也很容易:

import sys, json
from loguru import logger

def json_sink(message):
    record = message.record
    line = {
        "time": record["time"].isoformat(),
        "level": record["level"].name,
        "msg": record["message"],
        "file": record["file"].name,
    }
    sys.stdout.write(json.dumps(line, ensure_ascii=False) + "\n")

logger.add(json_sink, level="INFO")
logger.info("订单创建 {}", 1024)

也可以直接用 format 参数定制字符串模板,{time}、{level}、{message} 等占位符随手拈来。

六、异常捕获神器:@logger.catch 装饰器

这是 Loguru 最让人"上头"的功能。传统做法要给函数包一层 try/except,还要手动 logger.exception()。Loguru 只要一个装饰器:

from loguru import logger

@logger.catch
def divide(a, b):
    return a / b

divide(1, 0)   # 崩溃了吗?不,异常被捕获并打印出漂亮的完整堆栈

被装饰的函数一旦抛异常,Loguru 会用带语法高亮、带变量值的精美回溯打印出来,而且默认不会让程序挂掉(异常被吞掉)。若想让它照常抛出,加 @logger.catch(reraise=True)。

七、分级与过滤:不同模块不同策略

真实项目里,你往往希望"支付模块打 DEBUG,第三方库只打 WARNING"。用 filter 轻松实现:

# 只接收来自 payment 模块的日志
logger.add("pay.log", filter=lambda r: r["extra"].get("module") == "payment")

pay_logger = logger.bind(module="payment")
pay_logger.debug("支付请求签名完成")   # 进入 pay.log
logger.debug("其他模块日志")            # 不会进 pay.log

bind() 还能给日志附加任意上下文字段(如 user_id、request_id),排查问题时事半功倍。这是 logging 用起来很别扭、Loguru 一行就解决的典型场景。

八、实战:在 FastAPI 项目里集成 Loguru

结合我们之前讲过的 FastAPI,一个生产可用的日志配置长这样:

# logger_config.py
import sys
from loguru import logger

logger.remove()  # 关掉默认 handler
logger.add(
    sys.stdout,
    level="INFO",
    colorize=True,
    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
           "<level>{level:<8}</level> | "
           "<cyan>{name}</cyan>:{function}:{line} - <level>{message}</level>",
)
logger.add(
    "logs/api.log",
    rotation="00:00",
    retention="14 days",
    compression="zip",
    encoding="utf-8",
    enqueue=True,
    backtrace=True,
    diagnose=True,
)

然后在 FastAPI 里用它替代 print 和 uvicorn 自带的日志即可。配合前面学过的 Pydantic 校验、httpx 请求,一套现代 Python 后端的技术栈就齐活了。

九、新手最常踩的 3 个坑

1. 忘记 remove() 导致重复输出:多次 add() 同类型 handler 会让日志打印两遍。要么只配一次,要么先 remove() 再 add()。

2. 高并发忘了 enqueue=True:Web 服务里日志写入会阻塞请求线程,务必开启异步队列写入。

3. 和 logging 混用:若第三方库用标准库 logging,用 logger = logger.patch(...) 或 loguru 的 intercept 方案把 logging 桥接到 loguru,避免两套输出混乱。

十、总结:Loguru 速查表

需求 Loguru 写法
打印彩色日志 logger.info("hi")
写文件+滚动切割 logger.add("a.log", rotation="10 MB")
捕获函数异常 @logger.catch
附加上下文 logger.bind(user="Alice")
异步不阻塞 logger.add(..., enqueue=True)

一句话总结:Loguru 让你用近乎零的成本,获得生产级日志能力——彩色输出、文件滚动、异常神捕获、上下文绑定,每一项都直击痛点。新项目直接 pip install loguru,基本不会后悔。它和前面讲过的 FastAPI、Pydantic、httpx 同属现代 Python 后端"标配四件套",强烈建议一起学。

🚀 立即行动

pip install loguru → 把 print 换成 logger → 加一个写文件+滚动的 handler → 用 @logger.catch 包裹易错函数。

Loguru 官方文档:https://loguru.readthedocs.io/(含完整 API 与示例)

— END —
关注我们,每周一个 Python 热门技术实战教程

最新文章

随机文章