Loguru日志库比Logging好在哪

wen python案例 3

本文目录导读:

Loguru日志库比Logging好在哪

  1. 配置复杂度
  2. 格式化与模板
  3. 异常与回溯
  4. 动态级别与过滤
  5. 多 Sink 支持
  6. 序列化与结构化
  7. 多进程/异步支持
  8. 性能
  9. 什么时候用 Loguru 更好?
  10. 什么时候用 standard logging 更好?
  11. 总结表

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:需要手动实例化 FileHandlerRotatingFileHandler 等。
  • Loguruadd() 方法直接支持控制台、文件、网络、队列、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")  # 自动删除旧日志

    rotationretention 是内置参数,无需手动配置时间轮转逻辑。

序列化与结构化

  • 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 更好?

  • 大型企业项目,已经有成熟日志体系(如 logstashgraylog),且遵循标准接口(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 是更好的选择。

抱歉,评论功能暂时关闭!