[python] Python日志记录库loguru使用指北

Loguru是一个功能强大且易于使用的开源Python日志记录库。它建立在Python标准库中的logging模块之上,并提供了更加简洁直观、功能丰富的接口。Logging模块的使用见:Python日志记录库logging总结。Loguru官方仓库见:loguru,loguru官方文档见: loguru-doc。

Loguru的主要特点包括:

  • 简单易用:无需复杂的配置和定制即可实现基本的日志记录和输出。
  • 灵活的日志格式:支持自定义日志格式,并提供丰富的格式化选项。
  • 丰富的日志级别:支持多种日志级别,例如DEBUG、INFO、WARNING、ERROR和CRITICAL。
  • 多种日志目标:可以将日志输出到终端、文件、电子邮件、网络服务器等目标。
  • 强大的日志处理功能:支持日志过滤、格式化、压缩、旋转等功能。
  • 支持异步日志记录:能够极大地提升日志记录的性能。
  • 支持跨进程、跨线程的日志记录:可以安全地记录多进程、多线程应用程序的日志。

Loguru与logging是Python中常用的两个日志记录库,但两者在功能和易用性方面存在一些差异,如下所示:

特性Logurulogging
易用性更简单易用相对复杂
日志格式更灵活较简单
日志级别更丰富较少
日志目标更多种类较少
日志处理功能更强大较弱
异步日志记录支持不支持
跨进程、跨线程支持支持支持

总的来说,loguru在易用性、功能性和性能方面都优于logging。如果要一个简单、强大且易于使用的日志系统,loguru是一个很好的选择。而如果只是需要快速输出一些调试信息,print可能就足够了。不过,对于生产环境,使用loguru或其他日志系统通常会更加合适。

Loguru安装命令如下:

pip install loguru

# 查看loguru版本
import loguru
print(loguru.__version__) # 输出:0.7.2

文章目录

  • 1 使用说明
    • 1.1 基础用法
    • 1.2 日志配置
    • 1.3 进阶使用
  • 2 参考

1 使用说明

1.1 基础用法

简单使用

Loguru的核心概念是只有一个全局的日志记录器,也就是logger。这个设计使得日志记录变得非常简洁和一致。使用Loguru时,你不需要创建多个日志实例,而是直接使用这个全局的logger来记录信息。这不仅减少了配置的复杂性,也使得日志管理更加集中和高效。

from loguru import logger

logger.debug("这是一个调试信息")

输出:

2024-06-29 19:57:44.506 | DEBUG    | __main__:<module>:3 - 这是一个调试信息

Loguru日志输出默认格式如下:

  1. 时间戳:表示日志记录的具体时间,格式通常为年-月-日 时:分:秒.毫秒。
  2. 日志级别:表示这条日志的严重性级别。
  3. 进程或线程标识:表示日志来自哪个模块或脚本。 __main__ 表示日志来自主模块。如果是其他文件会显示文件名。
  4. 文件名和行号:记录日志消息的函数名和行号。
  5. 日志消息:实际的日志内容,此外loguru支持使用颜色来区分不同的日志级别,使得日志输出更加直观.

日志等级

Loguru可以通过简单的函数调用来记录不同级别的日志,并自动处理日志的格式化和输出。这一特点可以让使用者专注于记录重要的信息,而不必关心日志的具体实现细节。Loguru支持的日志级别,按照从最低到最高严重性排序:

  • TRACE: 最详细的日志信息,用于追踪代码执行过程。Loguru默认情况下使用DEBUG级别作为最低日志记录级别,而不是TRACE级别。这是因为TRACE级别会产生大量的日志信息。
  • DEBUG: 用于记录详细的调试信息,通常只在开发过程中使用,以帮助诊断问题。
  • INFO: 用于记录常规信息,比如程序的正常运行状态或一些关键的操作。
  • SUCCESS: 通常用于记录操作成功的消息,比如任务完成或数据成功保存。
  • WARNING: 用于记录可能不是错误,但需要注意或可能在未来导致问题的事件。
  • ERROR: 用于记录错误,这些错误可能会影响程序的某些功能,但通常不会导致程序完全停止。
  • CRITICAL: 用于记录非常严重的错误,这些错误可能会导致程序完全停止或数据丢失。
from loguru import logger

logger.debug("这是一条跟踪消息")
logger.debug("这是一条调试信息")
logger.info("这是一条普通信息")
logger.success("操作成功完成")
logger.warning("这是一条警告信息")
logger.error("这是一条错误信息")
logger.critical("这是一条严重错误信息")

输出:

2024-06-29 19:58:11.535 | DEBUG    | __main__:<module>:3 - 这是一条跟踪消息
2024-06-29 19:58:11.536 | DEBUG    | __main__:<module>:4 - 这是一条调试信息
2024-06-29 19:58:11.536 | INFO     | __main__:<module>:5 - 这是一条普通信息
2024-06-29 19:58:11.537 | SUCCESS  | __main__:<module>:6 - 操作成功完成
2024-06-29 19:58:11.537 | WARNING  | __main__:<module>:7 - 这是一条警告信息
2024-06-29 19:58:11.538 | ERROR    | __main__:<module>:8 - 这是一条错误信息
2024-06-29 19:58:11.538 | CRITICAL | __main__:<module>:9 - 这是一条严重错误信息

1.2 日志配置

在loguru中,add函数用于添加日志处理器。这个函数用于指定日志消息应该被发送到何处,例如控制台、文件或其他自定义的目的地。add函数主要参数介绍如下:

  • sink: 定义日志消息的输出位置,可以是文件路径、标准输出(stdout)、标准错误(stderr,默认)或其他自定义的输出位置。
  • format: 指定日志消息的格式,可以是简单的字符串,也可以是格式化字符串,支持各种字段插值。
  • level: 设置处理程序处理的日志消息的最低级别。比如设置为DEBUG,则处理程序将处理所有级别的日志消息。
  • filter: 可选参数,用于添加过滤器,根据特定的条件过滤掉不需要的日志消息。
  • colorize: 布尔值,指定是否对日志消息进行着色处理,使日志在控制台中更易于区分。
  • serialize: 布尔值,指定是否对日志消息进行序列化处理,通常与enqueue=True一起使用,以确保多线程安全。
  • enqueue: 布尔值,指定是否将日志消息放入队列中处理,用于多线程应用中避免阻塞。
  • backtrace: 布尔值或字符串,指定是否记录回溯信息,默认为False
  • diagnose: 布尔值,启用后,会在处理程序内部出现错误时记录诊断信息。
  • rotation: 日志文件轮换的配置,支持按大小或时间进行日志文件的轮换。
  • retention: 用于设置日志文件的保留时间。
  • compression: 布尔值,指定是否对轮换后的日志文件进行压缩处理。
from loguru import logger
import sys

# 终端显示不受该段代码设置
# 添加一个日志处理器,输出到文件
# 设置日志最低显示级别为INFO,format将设置sink中的内容
# sink链接的本地文件,如不存在则新建。如果存在则追写
logger.add(sink="myapp.log", level="INFO", format="{time:HH:mm:ss}  | {message}| {level}")

# debug结果不被显示到本地文件
logger.debug("这是一条调试信息")
logger.info("这是一条普通信息")

输出:

2024-06-29 19:58:56.159 | DEBUG    | __main__:<module>:11 - 这是一条调试信息
2024-06-29 19:58:56.159 | INFO     | __main__:<module>:12 - 这是一条普通信息

当连续两次调用 add 函数时,loguru 会将新的日志处理器添加到处理器列表中,而不是覆盖之前的处理器。这意味着所有添加的处理器都会接收到日志消息,并且按照它们被添加的顺序来处理这些消息。

from loguru import logger
logger.add(sink="myapp1.log", level="INFO")
logger.add(sink="myapp2.log", level="INFO")
# 会同时存入所有add添加日志处理器
logger.info("这是一条普通信息,存入myapp2")

如果想删除所有已添加的日志处理器,loguru运行使用 logger.remove()方法不带任何参数来移除所有日志处理器。

from loguru import logger
import sys

# 移除所有日志处理器(包括终端输出)
logger.remove()
logger.add(sink="myapp3.log", level="INFO", format="{time:HH:mm:ss}  | {message}| {level}")

logger.debug("这是一条调试信息存入myapp3")
logger.info("这是一条普通信息存入myapp3")

注意调用logger.remove()之后的所有日志将不会被记录,因为没有处理器了。

from loguru import logger
# 移除所有日志处理器(包括终端输出)
logger.remove()
# 没有输出
logger.info("这是一条普通信息存入myapp3")

如果希望移除某些日志处理器,而不是从所有日志器中移除,代码如下:

from loguru import logger

# 移除默认终端logger,如果终端存在。
# logger.remove(0)
# 添加多个文件处理器,enqueu设置异步日志记录
handler1 = logger.add("myapp1.log", enqueue=True)
print(handler1) # handler_id是移除的处理器的唯一标识符
handler2 = logger.add("myapp2.log")

# 记录一些日志
logger.info("这些信息会被记录到两个文件中")

# 移除特定的文件处理器
logger.remove(handler1)

# 现在只有myapp2.log 会记录日志
logger.info("这条信息只会记录在myapp2.log 中")

如果想将日志输出到日志台,代码如下:

from loguru import logger
import sys

logger.remove() # 移除默认输出
# 添加一个日志处理器,输出到控制台,使用自定义格式
logger.add(
    sink=sys.stdout,
    level="DEBUG",
    # green表示颜色
    format="<green>{time:HH:mm}</green> <level>{message}</level>"
)

# 注意终端显示会同步显示
logger.debug("这是一条调试信息")
logger.info("这是一条普通信息")

时间自定义

可以使用datatime库来自定义日志时间格式。

from datetime import datetime
from loguru import logger

# 自定义时间格式
# time_format = "%Y-%m-%d %H:%M:%S,%f"  # 包括微秒
time_format = "%H:%M:%S,%f"  # 包括微秒但不含年月日

# 定义日志格式,使用 datetime.now().strftime() 来格式化时间
log_format = "{time:" + time_format + "} - {level} - {message}"
logger.add("myapp.log", format=log_format, level="DEBUG")

# 记录一条日志
logger.debug("这是一个带有微秒的测试日志")

日志轮换

from loguru import logger
# 当文件大小达到100MB时创建新的日志文件,旧文件保留并重命名,用于防止单个日志文件变得过大。
logger.add("file_1.log", rotation="100 MB")
# 每天中午12时创建新的日志文件,旧文件保留并重命名
logger.add("file_2.log", rotation="12:00")
# 当日志文件存在超过一周时创建新的日志文件,旧文件保留并重命名
logger.add("file_3.log", rotation="1 week")
# 设置日志文件保留10天
logger.add("file_4.log", retention="10 days")
# 当文件大小达到100MB时创建新的日志文件,旧文件保留压缩为zip文件
logger.add('file_{time}.log', rotation="100 MB", compression='zip')

1.3 进阶使用

异常捕获

@logger.catch装饰器可以用来装饰my_function函数,并将这些异常信息记录到日志中。

from loguru import logger

logger.add(sink='myapp.log')

@logger.catch
def my_function(x, y):
    return x / y
        
res = my_function(0,0)

过滤

使用loguru库进行Python日志记录时,可以通过自定义的filter函数来筛选并记录特定的日志信息。此函数接收一个记录对象作为参数,根据日志消息内容(message)、级别(level)或其他日志属性,返回布尔值以决定是否记录该条日志。如果函数返回True,则日志被记录;若返回False,则忽略该日志。

from loguru import logger

# 定义一个过滤器函数
def my_filter(record):
    # 只记录包含 "第一" 的日志
    return "第一" in record["message"]

# 使用过滤器
logger.add("myapp.log", filter=my_filter)

# 记录一些日志
logger.info("第一个记录")
logger.info("第二个记录")

此外可以结合bind方法进行过滤,bind方法用于向日志记录器添加额外的上下文信息。这些信息将被包含在每条日志消息中,但不会改变日志消息本身。如下所示:

from loguru import logger

def filter_user(record):
    return record["extra"].get("user") =="A"

logger.add("myapp.log", filter=filter_user)

# 绑定user
logger.bind(user="A").info("来自A")
logger.bind(user="B").info("来自B")

2 参考

  • loguru
  • loguru-doc
  • Python日志记录库logging总结
  • Python日志库Loguru教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/760176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序分析之Clock rise/fall edge边沿对选取解析

目录 一、前言 二、Clock edge的选取逻辑 2.1 设计工程 2.2 同频同相 2.3 同频不同相1 2.4 同频不同相2 2.5 倍频关系(Fclk1>Fclk2) 2.6 倍频关系(Fclk1)<> 2.7 倍频关系存在相移(Fclk1)<> 2.8 非倍频关系无相移(Fclk1)<> 2.9 非倍频关系有相移…

在数字化转型中,中小企业如何打造数字化产品和服务?

引言&#xff1a;随着社会的发展和消费者行为的变化&#xff0c;市场对数字化产品和服务的需求日益增长。中小企业需要紧跟这一趋势&#xff0c;通过开发数字化产品和服务来满足消费者的新需求。云计算、大数据、人工智能等先进技术的出现&#xff0c;为中小企业提供了更多的机…

第5章_Modbus通讯协议

文章目录 5.1 学习Modbus的快速方法5.1.1 寄存器速记5.1.2 协议速记 5.2 初识Modbus5.2.1 背景5.2.2 什么是Modbus&#xff1f;1. Modbus简介2. Modbus特点3. Modbus常用术语4. Modbus事务处理 5.3 Modbus软件与使用5.3.1 Modbus软件简介5.3.2 Modbus Poll&#xff08;主站设备…

Pikachu靶场--Sql Inject

参考借鉴 pikachu靶场练习&#xff08;详细&#xff0c;完整&#xff0c;适合新手阅读&#xff09;-CSDN博客 数字型注入(post) 这种类型的SQL注入利用在用户输入处插入数值&#xff0c;而不是字符串。攻击者试图通过输入数字来修改SQL查询的逻辑&#xff0c;以执行恶意操作。…

C# OpenCvSharp 入门

摘要 C# OpenCvSharp 是一个基于OpenCV&#xff08;开源计算机视觉库&#xff09;的C#封装库&#xff0c;它提供了一组功能强大的工具和函数&#xff0c;用于图像处理、计算机视觉和计算机图形学等领域。通过使用OpenCvSharp库&#xff0c;您可以在C#应用程序中轻松地实现各种图…

5.6 0-1背包问题

#include<iostream> #include<string> #include<stdlib.h> #include<bits/stdc.h> using namespace std;int c;//背包容纳的重量 int n;//物品数量 int cw;//当前重量 int cv;//当前价值 int bestv;//当前最优价值 int x[100]; int bestx[100]; struct…

VMware每次打开网络设置都出现需要运行NetworkManager问题

每次打开都出现这个情况&#xff0c;是因为之前把NetworkManager服务服务关闭&#xff0c;重新输入命令&#xff1a; sudo systemctl start NetworkManager.service或者 sudo service network-manager restart 即可解决&#xff0c;但是每次开机重启都要打开就很麻烦&#xf…

无人机赋能工程测绘

勘察设计 业务挑战 采集效率低导致工程周期延长&#xff0c;难以满足及时交付的需求 外业工作量大&#xff0c;人员、时间、设备投入成本高 测绘成果单一&#xff0c;仅限于数字线划图&#xff0c;无法提供可视化模型 无人机优势 快速构建二三维模型&#xff0c;提供丰富…

Go 语言环境搭建

本篇文章为Go语言环境搭建及下载编译器后配置Git终端方法。 目录 安装GO语言SDK Window环境安装 下载 安装测试 安装编辑器 下载编译器 设置git终端方法 总结 安装GO语言SDK Window环境安装 网站 Go下载 - Go语言中文网 - Golang中文社区 还有 All releases - The…

PyTorch使用GPU进行Tensor及模型计算

文章目录 1. 计算设备&#xff1a;GPU/CPU2. Tensor的GPU计算3. 模型的GPU计算 对复杂的神经网络和大规模的数据来说&#xff0c;使用CPU来计算可能不够高效。这里&#xff0c;我们将介绍如何使用单块NVIDIA GPU来计算。 首先&#xff0c;需要确保已经安装好了PyTorch GPU版本…

系统运维面试总结(shell编程)

SYNDDOS攻击&#xff0c;需要判断这个访问是正常访问还是信包攻击&#xff0c;当前这个信包发起的访问数量是多少&#xff0c;例如看到30个信包同时再访问时设置监控报警。

使用LabVIEW报告生成工具包时报错97

问题详情&#xff1a; 在运行使用Excel/Word调用节点的程序时&#xff0c;收到错误97&#xff1a;LabVIEW&#xff1a;&#xff08;十六进制0x61&#xff09;输入中传递了一个空引用句柄或先前已删除的引用句柄。 当运行报告生成工具包中的一个示例程序时&#xff0c;收到错误…

什么是 人工智能(AI)与机器学习(ML)?

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;和机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是现代科技的核心概念&#xff0c;它们在不同领域中应用广泛。了解它们之间的关系及其工作原理对理解现代技术至关重要。本文将详细介…

Django 页面展示模型创建表的数据

1&#xff0c;添加视图函数 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 获取其他字段的值# 创建用户实例…

什么是TOGAF架构框架的ADM方法?

ADM是架构开发方法&#xff08; Architecture Development Method&#xff09;&#xff0c;为开发企业架构所要执行的各个步骤以及它们质检的关系进行详细的定义&#xff0c;它是TOGAF规范中最为核心的内容。 ADM的具体步骤&#xff1a; 预备阶段&#xff08;Preliminary Phas…

C# Benchmark

创建控制台项目&#xff08;或修改现有项目的Main方法代码&#xff09;&#xff0c;Nget导入Benchmark0.13.12&#xff0c;创建测试类&#xff1a; public class StringBenchMark{int[] numbers;public StringBenchMark() {numbers Enumerable.Range(1, 20000).ToArray();}[Be…

【每日一练】python运算符

1. 算术运算符 编写一个Python程序&#xff0c;要求用户输入两个数&#xff0c;并执行以下运算&#xff1a;加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数&#xff1a;") b input("请输入第二个数&…

ffmpeg使用bmp编码器把bgr24编码为bmp图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 不使用AVOutputFormat code void CFfmpegOps::EncodeBGR24ToBMP(const char* infile, const char* width_str, const char* height_str…

Axure使用小技巧

Axure的小技巧 在这个数字化时代&#xff0c;用户体验设计已成为产品成功的关键。 Axure RP&#xff0c;作为一款强大的原型设计和规格文档工具&#xff0c;为设计师和产品经理提供了一个平台&#xff0c;让他们能够将创意转化为交互式的原型。 然而&#xff0c;Axure的强大…