python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python日志打印库loguru

Python最强日志打印库loguru安装到高级用法逐步详解

作者:小灰灰搞电子

对于python开发者来说,Loguru是一个简单但功能强大的日志记录库,与Python内置的logging模块相比,Loguru提供了更简洁的API和更多的功能,它使得跟踪代码的行为变得轻松而高效,这篇文章主要介绍了Python最强日志打印库loguru安装到高级用法的相关资料,需要的朋友可以参考下

一、Python日志打印库loguru详解

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

1、 介绍

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

2、安装

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

pip install loguru

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

3、基本用法

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

4、配置输出目标

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

5、 日志格式化和过滤器

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

6、 高级特性

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

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模块有显著优势:

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 
2026-04-02 09:02:25.883 | 25844 | MainThread | INFO     | __main__:<module>:128 - === Loguru 高级示例启动 ===
2026-04-02 09:02:25.884 | 25844 | MainThread | INFO     | __main__:demo_business_logic:83 - 业务逻辑执行中,当前时间: 2026-04-02 09:02:25.884706
2026-04-02 09:02:25.884 | 25844 | MainThread | INFO     | __main__:demo_business_logic:90 - 订单创建成功
2026-04-02 09:02:25.884 | 25844 | MainThread | SUCCESS  | __main__:demo_business_logic:92 - 业务逻辑执行完成✅
2026-04-02 09:02:25.884 | 25844 | MainThread | INFO     | __main__:<module>:134 - === 开始多线程日志测试 ===
2026-04-02 09:02:25.885 | 25844 | Thread-0 | INFO     | __main__:demo_business_logic:83 - 业务逻辑执行中,当前时间: 2026-04-02 09:02:25.885793
2026-04-02 09:02:25.885 | 25844 | Thread-1 | INFO     | __main__:demo_business_logic:83 - 业务逻辑执行中,当前时间: 2026-04-02 09:02:25.885793
2026-04-02 09:02:25.885 | 25844 | Thread-0 | INFO     | __main__:demo_business_logic:90 - 订单创建成功
2026-04-02 09:02:25.886 | 25844 | Thread-1 | INFO     | __main__:demo_business_logic:90 - 订单创建成功
2026-04-02 09:02:25.886 | 25844 | Thread-2 | INFO     | __main__:demo_business_logic:83 - 业务逻辑执行中,当前时间: 2026-04-02 09:02:25.886883
2026-04-02 09:02:25.886 | 25844 | Thread-Error | INFO     | __main__:demo_business_logic:83 - 业务逻辑执行中,当前时间: 2026-04-02 09:02:25.886883
2026-04-02 09:02:25.886 | 25844 | Thread-0 | SUCCESS  | __main__:demo_business_logic:92 - 业务逻辑执行完成✅
2026-04-02 09:02:25.886 | 25844 | Thread-1 | SUCCESS  | __main__:demo_business_logic:92 - 业务逻辑执行完成✅
2026-04-02 09:02:25.887 | 25844 | Thread-2 | INFO     | __main__:demo_business_logic:90 - 订单创建成功
2026-04-02 09:02:25.887 | 25844 | Thread-2 | SUCCESS  | __main__:demo_business_logic:92 - 业务逻辑执行完成✅
2026-04-02 09:02:25.887 | 25844 | Thread-Error | 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(Thread-Error, started 21588)>

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

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

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

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

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

总结

到此这篇关于Python最强日志打印库loguru安装到高级用法逐步详解的文章就介绍到这了,更多相关Python日志打印库loguru内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文