[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 loggerlogger.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 loggerlogger.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 syslogger.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 loggerlogger.add(sink='myapp.log')@logger.catch
def my_function(x, y):return x / yres = 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 loggerdef 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.mzph.cn/news/863720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用合成数据训练边缘侧火灾检测器

火灾是人类面临的重大威胁&#xff0c;检测火灾至关重要。目前的火焰传感器在距离检测方面存在局限性。为了克服这个问题&#xff0c;我的目标是使用机器学习方法创建一个轻量级且高度准确的火灾检测系统。当需要实时数据处理或机器学习模型可用的数据集很少时&#xff0c;这个…

ELK企业级实战

一、Elstic stack在企业的常⻅架构 https://www.bilibili.com/video/BV1x94y1674x/?buvidXY705117E90F73A790429C9CFBD5F70F22168&vd_source939ea718db29535a3847d861e5fe37ef ELK 解决取得问题 痛点1: ⽣产出现故障后&#xff0c;运维需要不停的查看各种不同的⽇志进⾏…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

逻辑操作符

目录 && --- 逻辑与操作符 || --- 逻辑或操作符 && --- 逻辑与操作符 逻辑与操作符有并且的意思&#xff0c;一般用于判断语句中 逻辑与操作符运行规则是都要为真&#xff0c;才会继续执行或计算 360笔试题&#xff1a; 有关前置(--)&#xff0c;后置(-…

树莓派安装windows系统

第1步&#xff1a; https://uupdump.net/下载对应的系统文件&#xff0c;所有选择项都默认选择。 第2步&#xff1a; 解压下载后的文件&#xff0c;双击运行下面文件。等待下载完成&#xff0c;等待过程很漫长&#xff0c;很考验耐心。 第3步&#xff1a; 提示已经finish了&…

Streamer-Sales 销冠 —— 卖货主播大模型来了,一键让你成为销冠!

今天给大家推荐一个在GitHub上非常火的卖货主播大模型 Streamer-Sales&#xff0c;旨在让你成为销冠。 这是一个能够根据商品特点进行解说的卖货主播大模型&#xff0c;通过生成的细腻、独到的解说词&#xff0c;激发用户的购买欲望。 相关链接 项目地址&#xff1a;github.c…

黑龙江等保测评流程

一、等保测评概述 黑龙江等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是一项依据国家网络安全等级保护制度规定&#xff0c;对非涉及国家秘密的网络安全等级保护状况进行检测评估的活动。它包括标准符合性评判活动和风险评估活动&#xff0c;旨在依据网络安全等级…

一文入门Nanomsg通信库

转载自本人博客&#xff1a;https://www.jjy2023.cn/2024/06/27/%e4%b8%80%e6%96%87%e5%85%a5%e9%97%a8nanomsg%e9%80%9a%e4%bf%a1%e5%ba%93/ 1. Nanomsg介绍 Nanomsg官方在线文档&#xff1a;https://nanomsg.org/index.html 本文全部代码用C实现。 以前一直在使用ZeroMQ库处理…

点云从入门到精通技术详解100篇-基于卷积和注意力机制的3D点云特征提取

目录 前言 国内外研究现状 卷积神经网络 三维卷积神经网络 稀疏卷积[21] 基于3D点云数据的目标分类任务 基于Transformer[12]的点云特征提取 神经网络归一化策略 基于3D点云的语义分割任务[45] 基于3D点云的实例分割任务 基于3D点云的目标检测任务[73], [74] 2 相关…

关于Unity运行时动态修改材质的小秘密

一、问题背景 在以往的Unity项目中涉及到修改材质的需求时&#xff0c;也只是改改材质贴图&#xff0c;材质颜色等&#xff0c;也没遇到那么多动态修改材质的坑。最近在做Unity App Demo时也遇到了要修改材质的小需求&#xff0c;本以为几分钟就能完成了&#xff0c;却花费了我…

淘宝商品评论爬虫实战指南:基于Requests与Cookies的实现

在本指南中&#xff0c;我们将深入探讨如何使用Python的requests库结合Cookies机制&#xff0c;高效且合法地爬取淘宝网上的任意商品评论数据。此教程不仅涵盖技术细节&#xff0c;还涉及道德与合规性考量&#xff0c;旨在为读者提供一个全面且实用的爬虫开发框架。 一、前言与…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

如何用DCA1000持续采集雷达数据

摘要&#xff1a;本文介绍一下如何通过mmwave studio软件&#xff0c;搭配DCA1000数据采集卡&#xff0c;对AWR1843BOOST进行不间断的数据采集。本文要求读者已经掌握了有关基础知识。 本文开放获取&#xff0c;无需关注。 到SensorConfig页面下&#xff0c;一步步操作&#xf…

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…

283. 移动零【快慢指针】【C++】

题目描述 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nu…

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

昇思25天学习打卡营第7天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 前面几天依次学习了前面几个步骤的操作&#xff0c;今天继续学习模型训练。 数据集和神经网络模型这个前面已经有详细的介绍。准确…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序&#xff0c;并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样&#xff0c;预示着他除了运行监视、故障处理外&…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…