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() 方法

使用惰性求值优化性能:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值