Python 日志组件Loguru使用指南

logging 与 loguru 的核心差异

  • 配置复杂度

  • 标准 logging 需手动实例化命名的 Logger,并配置 HandlerFormatter 和 Filter

  • Loguru 通过 add() 简化配置步骤,开箱即用。

  • 默认输出流
    两者默认均输出到 sys.stderr(POSIX 标准指定 stderr 为诊断输出流),避免与 stdout 的应用输出混淆,且处理编码问题更友好(如 python my_app.py | other_app 管道场景)。


  • 迁移

    替换 getLogger() 函数

    # 标准 logging
    import logging
    logger = logging.getLogger(__name__)
    
    # Loguru
    from loguru import logger  # 自动记录上下文 __name__

     替换 Logger 对象

    Loguru 通过 bind() 绑定上下文,替代多 Logger 实例:

    # 标准 logging 的多日志器
    logger_a = logging.getLogger("a")
    logger_b = logging.getLogger("b")
    
    # Loguru 绑定不同上下文
    logger_a = logger.bind(name="a")
    logger_b = logger.bind(name="b")
    
    # 按名称过滤日志
    logger.add("a.log", filter=lambda r: r["extra"].get("name") == "a")
    logger.add("b.log", filter=lambda r: r["extra"].get("name") == "b")

    替换 HandlerFilterFormatter

    标准配置:

    # 标准 logging 配置
    logger.setLevel(logging.DEBUG)
    fh = logging.FileHandler("spam.log")
    fh.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    Loguru 简化版:

    # Loguru 等效配置
    fmt = "{time} - {name} - {level} - {message}"
    logger.add("spam.log", level="DEBUG", format=fmt)

    替换 LogRecord 对象

    Loguru 使用 record 字典存储日志详情(对应 LogRecord 属性),可在处理器中访问:

    def advanced_sink(message):
        record = message.record
        if record["level"].no >= 50:
            print(f"Critical error in {record['file'].path}", file=sys.stderr)
    
    logger.add(advanced_sink)

     替换 % 风格格式化

    仅支持 {} 风格:

    # 标准 logging
    logger.debug("变量值: %s", var)
    
    # Loguru
    logger.debug("变量值: {}", var)  # 类似 str.format()

    替换 exc_info 参数

    使用 opt(exception=True) 捕获异常堆栈:

    # 标准 logging
    logger.debug("错误:", exc_info=True)
    
    # Loguru
    logger.opt(exception=True).debug("错误:")  # 自动捕获完整堆栈(生产环境慎用)

    替换 extra 参数与 LoggerAdapter

    通过 bind() 添加上下文:

    # 标准 logging
    logger.info("协议错误", extra={"clientip": "192.168.0.1", "user": "fbloggs"})
    
    # Loguru
    logger.bind(clientip="192.168.0.1", user="fbloggs").info("协议错误")
    
    # 格式化时引用
    fmt = "{time} {extra[clientip]} {extra[user]} {message}"

     替换 isEnabledFor() 方法

    使用惰性求值优化性能:

    
    

    作者:ftpeak

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 日志组件Loguru使用指南

    发表回复