欢迎光临
我们一直在努力

Python最强日志打印库loguru详解

Python最强日志打印库loguru详解

  • 一、Python日志打印库loguru详解
    • 1、 介绍
    • 2、安装
    • 3、基本用法
    • 4、配置输出目标
    • 5、 日志格式化和过滤器
    • 6、 高级特性
    • 7、代码示例
    • 8、与标准库logging比较
    • 9、总结
  • 二、代码示例
    • 1、源码分享
    • 二、运行结果

在这里插入图片描述

一、Python日志打印库loguru详解

loguru是一个简单、强大且灵活的Python日志库,旨在替代标准库logging模块,提供更简洁的API和更少的配置负担。它通过一个全局的logger对象简化日志记录过程,支持多种输出目标、日志旋转、异常捕获等高级特性。下面我将从安装到高级用法逐步详解,帮助您全面掌握loguru。

1、 介绍

loguru库由Delgan开发,其核心设计理念是“开箱即用”,减少日志记录的样板代码。相比于Python内置的logging模块,loguru无需复杂的handler配置,直接提供丰富的功能。主要优点包括:

  • 简洁性:单行代码即可添加日志处理器。
  • 灵活性:支持自定义格式、过滤器和输出目标。
  • 易用性:内置异常捕获和上下文管理。 loguru适用于各种应用场景,从小型脚本到大型项目,都能高效处理日志。

2、安装

安装loguru非常简单,使用pip命令即可:

pip install loguru

安装后,您可以直接在Python脚本中导入并使用它。

3、基本用法

loguru的核心是全局logger对象。导入后,即可直接记录日志,无需额外配置。默认情况下,日志输出到标准错误流(stderr),并包含时间戳、日志级别和消息。

  • 导入logger:

    from loguru import logger

  • 记录日志: loguru支持标准日志级别:

    D

    E

    B

    U

    G

    DEBUG

    DEBUG

    I

    N

    F

    O

    INFO

    INFO

    W

    A

    R

    N

    I

    N

    G

    WARNING

    WARNING

    E

    R

    R

    O

    R

    ERROR

    ERROR

    C

    R

    I

    T

    I

    C

    A

    L

    CRITICAL

    CRITICAL。使用对应方法记录消息:

    logger.debug("这是一条调试信息")
    logger.info("这是一条普通信息")
    logger.warning("这是一条警告信息")
    logger.error("这是一条错误信息")
    logger.critical("这是一条严重错误信息")

    运行以上代码,日志会输出到控制台,格式类似:[2023-10-05 12:34:56] INFO: 这是一条普通信息。

  • 日志级别控制: 默认日志级别为

    D

    E

    B

    U

    G

    DEBUG

    DEBUG,但可以通过配置调整。例如,只记录

    I

    N

    F

    O

    INFO

    INFO及以上级别的日志:

    logger.remove() # 移除默认处理器
    logger.add(sys.stderr, level="INFO") # 添加新处理器,设置级别为INFO

    这里,logger.remove()用于清除默认配置,logger.add()添加自定义处理器。

4、配置输出目标

loguru允许添加多个处理器,将日志输出到不同目标,如文件、控制台或网络服务。使用logger.add()方法灵活配置。

  • 输出到文件: 最简单的文件日志配置:

    logger.add("app.log") # 日志输出到app.log文件

    日志文件会自动创建并追加内容。

  • 日志旋转: loguru内置日志旋转功能,防止文件过大。支持按时间或文件大小旋转:

    # 按文件大小旋转:当文件超过1MB时,创建新文件,最多保留3个备份
    logger.add("app.log", rotation="1 MB", retention=3)

    # 按时间旋转:每天午夜旋转日志
    logger.add("app.log", rotation="00:00")

    参数rotation指定旋转条件,retention控制备份文件保留数量。

  • 输出到控制台: 默认已输出到stderr,但可以自定义格式:

    logger.add(sys.stdout, format="{time} | {level} | {message}")

    这里,format参数定义输出格式,使用花括号{}引用变量如time(时间)、level(级别)、message(消息)。

5、 日志格式化和过滤器

loguru提供强大的格式化选项,支持自定义消息结构和添加上下文信息。

  • 自定义格式: 使用format参数定义日志格式。例如,添加进程ID和线程ID:

    logger.add("app.log", format="{time} | {level} | {process} | {thread} | {message}")

    可用变量包括:

    • {time}: 时间戳
    • {level}: 日志级别(如

      I

      N

      F

      O

      INFO

      INFO

    • {message}: 日志消息
    • {file}: 文件名
    • {line}: 代码行号
    • {function}: 函数名 您还可以使用格式化字符串,例如{time:YYYY-MM-DD HH:mm:ss}指定时间格式。
  • 添加过滤器: 通过filter参数过滤日志。例如,只记录来自特定模块的日志:

    def my_filter(record):
    return "important" in record["message"] # 只包含消息中带"important"的日志
    logger.add("app.log", filter=my_filter)

    record是一个字典,包含所有日志信息。

6、 高级特性

loguru支持多种高级功能,提升日志记录的实用性和可靠性。

  • 异常捕获: 使用@logger.catch装饰器自动捕获函数内的异常,并记录详细堆栈信息:

    @logger.catch
    def risky_function():
    return 1 / 0 # 会触发异常

    risky_function()

    当异常发生时,loguru会记录错误消息和堆栈跟踪,便于调试。

  • 上下文变量: 在日志消息中添加额外上下文,使用bind()方法:

    logger.add("app.log", format="{extra[user]} | {message}")

    user_logger = logger.bind(user="admin") # 绑定用户上下文
    user_logger.info("用户登录成功") # 输出: admin | 用户登录成功

    这在多用户系统中非常有用。

  • 异步日志: loguru支持异步日志记录,提高性能:

    logger.add("app.log", enqueue=True) # 启用异步队列

    参数enqueue=True确保日志写入不阻塞主线程。

  • 自定义处理器: 您可以创建自定义处理器,例如发送日志到远程服务:

    def custom_sink(message):
    # 模拟发送到网络
    print(f"发送日志: {message}")

    logger.add(custom_sink)

7、代码示例

下面是一个完整示例,演示loguru的安装、配置和使用:

from loguru import logger
import sys

# 配置日志:输出到文件和控制台,设置格式和旋转
logger.remove() # 移除默认处理器
logger.add("app.log", rotation="1 MB", retention=3, format="{time} | {level} | {message}")
logger.add(sys.stdout, format="{time} | {level} | {message}")

# 记录不同级别日志
logger.info("应用程序启动")
logger.warning("磁盘空间不足")

# 使用异常捕获
@logger.catch
def divide(a, b):
return a / b

try:
divide(10, 0)
except Exception:
logger.error("发生除法错误")

# 添加上下文
user_logger = logger.bind(user="Alice")
user_logger.info("用户操作完成")

在这里插入图片描述

8、与标准库logging比较

loguru相比Python内置logging模块有显著优势:

  • 配置简化:无需创建handlers、formatters和filters,单行代码完成配置。
  • API直观:全局logger对象直接使用,减少学习曲线。
  • 功能丰富:内置旋转、异常捕获等,无需额外扩展。 但loguru不适用于需要高度自定义日志架构的复杂场景,此时标准库可能更合适。

9、总结

loguru是一个高效、易用的Python日志库,特别适合快速开发和维护项目。通过本详解,您应已掌握其核心功能:

  • 基本日志记录和级别控制。
  • 输出目标配置(文件、控制台)。
  • 高级特性如日志旋转、异常捕获和上下文绑定。

二、代码示例

1、源码分享

import sys
from loguru import logger
from datetime import datetime
import threading
import time

# ————————– 1. 自定义日志格式(复杂格式) ————————–
# 格式说明:时间 | 进程ID | 线程名 | 日志级别 | 模块名 | 函数名 | 日志内容
LOG_FORMAT = (
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<blue>{process.id}</blue> | "
"<magenta>{thread.name}</magenta> | "
"<level>{level: <8}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> – "
"<level>{message}</level>"
)

# ————————– 2. 配置多文件日志输出(分级别/分场景) ————————–
# 清空默认控制台输出(按需保留)
logger.remove()

# 2.1 控制台输出:彩色日志,只输出 INFO 及以上级别
logger.add(
sink=sys.stdout,
format=LOG_FORMAT,
level="INFO",
enqueue=True, # 异步输出,提升性能
colorize=True # 彩色日志
)

# 2.2 错误日志单独文件:只保存 ERROR/CRITICAL 级别,自动压缩
logger.add(
sink="logs/error_{time:YYYY-MM-DD}.log", # 按天分割文件
format=LOG_FORMAT,
level="ERROR",
encoding="utf-8",
rotation="00:00", # 每天凌晨分割新文件
retention="30 days", # 保留30天日志
compression="zip", # 旧日志自动压缩为zip
enqueue=True,
backtrace=True, # 完整异常堆栈
diagnose=True # 开发环境开启变量诊断,生产环境建议关闭
)

# 2.3 全量日志文件:保存所有级别日志,文件大小超过100MB自动分割
logger.add(
sink="logs/all_{time:YYYY-MM-DD}.log",
format=LOG_FORMAT,
level="DEBUG",
encoding="utf-8",
rotation="100 MB", # 按文件大小分割
retention="15 days",
enqueue=True
)

# ————————– 3. 自定义日志过滤(精准过滤日志) ————————–
def filter_debug_only(record):
"""仅保留DEBUG级别日志"""
return record["level"].name == "DEBUG"

# 单独保存DEBUG级别日志
logger.add(
sink="logs/debug.log",
format=LOG_FORMAT,
filter=filter_debug_only,
encoding="utf-8",
enqueue=True
)

# ————————– 4. 上下文绑定(统一添加日志字段) ————————–
# 全局绑定公共字段:请求ID、用户ID
logger = logger.bind(request_id="REQ_123456", user_id="UID_789")

# ————————– 5. 高级功能:异常捕获、结构化日志、多线程测试 ————————–
def demo_business_logic(num: int):
"""模拟业务逻辑"""
try:
# 分级日志打印
logger.debug(f"开始执行业务逻辑,参数: {num}")
logger.info(f"业务逻辑执行中,当前时间: {datetime.now()}")

if num < 0:
# 手动抛出异常,测试异常日志
raise ValueError("数字不能为负数!")

# 结构化日志(JSON格式,方便日志平台解析)
logger.bind(biz_type="order").info("订单创建成功", extra={"order_id": "ORDER_001", "amount": 99.9})

logger.success("业务逻辑执行完成✅")
except Exception as e:
# 自动捕获完整异常堆栈
logger.exception("业务逻辑执行失败:")

def multi_thread_test():
"""多线程日志测试"""
threads = []
for i in range(3):
t = threading.Thread(target=demo_business_logic, args=(i,), name=f"Thread-{i}")
threads.append(t)
t.start()

# 测试异常线程
error_thread = threading.Thread(target=demo_business_logic, args=(1,), name="Thread-Error")
error_thread.start()

for t in threads:
t.join()
error_thread.join()

# ————————– 6. 日志级别动态修改 ————————–
def change_log_level(new_level: str):
"""动态修改日志级别"""
logger.remove()
# 重新添加处理器,修改level参数
logger.add(sys.stdout, format=LOG_FORMAT, level=new_level, colorize=True)
logger.add("logs/error.log", format=LOG_FORMAT, level="ERROR", encoding="utf-8")
logger.info(f"日志级别已修改为: {new_level}")

# ————————– 主程序入口 ————————–
if __name__ == "__main__":
# 自动创建logs文件夹(loguru会自动创建)
logger.info("=== Loguru 高级示例启动 ===")

# 执行业务逻辑
demo_business_logic(10)

# 执行多线程测试
logger.info("=== 开始多线程日志测试 ===")
multi_thread_test()

# 动态修改日志级别为WARNING(仅输出警告及以上)
logger.info("=== 动态修改日志级别为 WARNING ===")
change_log_level("WARNING")

# 测试级别修改效果
logger.debug("这条DEBUG日志不会输出")
logger.warning("这条WARNING日志会输出")

logger.critical("=== 程序运行结束,关键日志已全部保存 ===")

二、运行结果

C:\\Users\\徐鹏\\Desktop\\55\\.venv\\Scripts\\python.exe C:\\Users\\徐鹏\\Desktop\\55\\main.py
20260402 09:02:25.883 | 25844 | MainThread | INFO | __main__:<module>:128 === Loguru 高级示例启动 ===
20260402 09:02:25.884 | 25844 | MainThread | INFO | __main__:demo_business_logic:83 业务逻辑执行中,当前时间: 20260402 09:02:25.884706
20260402 09:02:25.884 | 25844 | MainThread | INFO | __main__:demo_business_logic:90 订单创建成功
20260402 09:02:25.884 | 25844 | MainThread | SUCCESS | __main__:demo_business_logic:92 业务逻辑执行完成✅
20260402 09:02:25.884 | 25844 | MainThread | INFO | __main__:<module>:134 === 开始多线程日志测试 ===
20260402 09:02:25.885 | 25844 | Thread0 | INFO | __main__:demo_business_logic:83 业务逻辑执行中,当前时间: 20260402 09:02:25.885793
20260402 09:02:25.885 | 25844 | Thread1 | INFO | __main__:demo_business_logic:83 业务逻辑执行中,当前时间: 20260402 09:02:25.885793
20260402 09:02:25.885 | 25844 | Thread0 | INFO | __main__:demo_business_logic:90 订单创建成功
20260402 09:02:25.886 | 25844 | Thread1 | INFO | __main__:demo_business_logic:90 订单创建成功
20260402 09:02:25.886 | 25844 | Thread2 | INFO | __main__:demo_business_logic:83 业务逻辑执行中,当前时间: 20260402 09:02:25.886883
20260402 09:02:25.886 | 25844 | ThreadError | INFO | __main__:demo_business_logic:83 业务逻辑执行中,当前时间: 20260402 09:02:25.886883
20260402 09:02:25.886 | 25844 | Thread0 | SUCCESS | __main__:demo_business_logic:92 业务逻辑执行完成✅
20260402 09:02:25.886 | 25844 | Thread1 | SUCCESS | __main__:demo_business_logic:92 业务逻辑执行完成✅
20260402 09:02:25.887 | 25844 | Thread2 | INFO | __main__:demo_business_logic:90 订单创建成功
20260402 09:02:25.887 | 25844 | Thread2 | SUCCESS | __main__:demo_business_logic:92 业务逻辑执行完成✅
20260402 09:02:25.887 | 25844 | ThreadError | ERROR | __main__:demo_business_logic:95 业务逻辑执行失败:
Traceback (most recent call last):

File "E:\\Python\\pyhon3.8.2\\lib\\threading.py", line 890, in _bootstrap
self._bootstrap_inner()
│ └ <function Thread._bootstrap_inner at 0x00000291EC49F040>
<Thread(ThreadError, started 21588)>

File "E:\\Python\\pyhon3.8.2\\lib\\threading.py", line 932, in _bootstrap_inner
self.run()
│ └ <function Thread.run at 0x00000291EC49CD30>
<Thread(ThreadError, started 21588)>

File "E:\\Python\\pyhon3.8.2\\lib\\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
│ │ │ │ │ └ {}
│ │ │ │ └ <Thread(ThreadError, started 21588)>
│ │ │ └ (1,)
│ │ └ <Thread(ThreadError, started 21588)>
│ └ <function demo_business_logic at 0x00000291EE35ADC0>
<Thread(ThreadError, started 21588)>

> File "C:\\Users\\徐鹏\\Desktop\\55\\main.py", line 87, in demo_business_logic
raise ValueError("数字不能为负数!")

ValueError: 数字不能为负数!
20260402 09:02:25.899 | 25844 | MainThread | INFO | __main__:<module>:138 === 动态修改日志级别为 WARNING ===
20260402 09:02:25.902 | 25844 | MainThread | WARNING | __main__:<module>:143 这条WARNING日志会输出
20260402 09:02:25.902 | 25844 | MainThread | CRITICAL | __main__:<module>:145 === 程序运行结束,关键日志已全部保存 ===

进程已结束,退出代码为 0

在这里插入图片描述 在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » Python最强日志打印库loguru详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址