当前位置: 首页 > news >正文

酷炫的python日志库-loguru

Loguru是一个python的日志库,比logging更简单,好用,功能丰富。

GitHub - Delgan/loguru: Python logging made (stupidly) simple

安装

pip install loguru

特征

  • 开箱即用,补样板
  • 没有处理程序,没有清理程序,没有过滤器:一个函数可以统治所有这些
  • 通过旋转/保留/压缩更轻松地记录文件
  • 使用大字符串样式的现代字符串格式
  • 在线程或主线程中捕获异常
  • 漂亮的颜色记录
  • 异步、线程安全、多进程安全
  • 完整描述性异常
  • 根据需要形成日志记录
  • 昂贵费用的评估
  • 可定制的级别
  • 更好的日期时间处理
  • 适用于脚本和库
  • 与标准日志记录完全兼容
  • 通过环境变量进行个性化默认设置
  • 方便的解析器
  • 观赏的通知程序
  • 比内置日志记录快 10 倍

参观游乐场

开箱即用,补样板

Loguru 的主要概念只有一个 。logger

为了方便入门,它是预先配置的并且从一stderr开始就输出(但这是完全可配置的)。

from loguru import loggerlogger.debug("That's it, beautiful and simple logging!")

这只是一个将日志消息分派到配置的处理程序的接口。很简单,对吧?logger

没有处理程序,没有清理程序,没有过滤器:一个函数可以统治所有这些

如何添加处理程序?如何设置日志格式?如何过滤消息?如何设置水平?

答案之一:功能。add()

logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")

此函数评估注册负责管理与记录字典上下文相关的日志消息的接收器。接收器可以采用多种形式:简单函数、字符串路径、类文件对象、协程函数或内置处理程序。

请注意,您还可以使用添加时返回的标识符来添加先前添加的处理程序。如果您想替换默认处理程序,这特别有用:只需调用即可重新开始。remove()stderrlogger.remove()

通过旋转/保留/压缩更轻松地记录文件

如果最多记录的消息发送到文件,只需使用字符串路径作为接收器。为了方便起见,它也可以自动解析:

logger.add("file_{time}.log")

如果您需要旋转记录器,如果您想删除较旧的日志,或者如果您希望在关闭时压缩文件,它也可以轻松配置。

logger.add("file_1.log", rotation="500 MB")    # Automatically rotate too big file
logger.add("file_2.log", rotation="12:00")     # New file is created each day at noon
logger.add("file_3.log", rotation="1 week")    # Once the file is too old, it's rotatedlogger.add("file_X.log", retention="10 days")  # Cleanup after some timelogger.add("file_Y.log", compression="zip")    # Save some loved space

使用大字符串样式的现代字符串格式

Loguru 更喜欢更优雅和更强大的{}格式%,日志记录功能实际上实际上str.format()

logger.info("If you're using Python {}, prefer {feature} of course!", 3.6, feature="f-strings")

在线程或主线程中捕获异常

您是否曾遇到过您的程序意外崩溃而在日志文件中看不到任何内容?您是否注意到线程中发生的异常没有被记录?这可以使用装饰器/上下文管理器来解决,它确保任何错误都传播到正确的地方。catch()logger

@logger.catch
def my_function(x, y, z):# An error? It's caught anyway!return 1 / (x + y + z)

漂亮的颜色记录

如果您的兼容,Loguru 会自动为您的日志添加颜色。您可以通过使用接收器格式的标记来定义您喜欢的样式。

logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")

异步、线程安全、多进程安全

默认情况下,添加到的所有接收器都是线程安全的。它们不是多进程安全的,但您可以通过消息来确保日志的限制。如果您想要异步日志记录,也可以使用相同的参数。loggerenqueue

logger.add("somefile.log", enqueue=True)

首先接收器的协程函数也受支持,并且应该使用等待。complete()

完整描述性异常

记录代码中的异常对于跟踪错误非常重要,但如果您不知道失败的原因,那么它就没用处。Loguru 通过允许显示整个堆栈(跟踪包括标记值)来帮助您识别问题(感谢您!) 。better_exceptions

代码:

logger.add("out.log", backtrace=True, diagnose=True)  # Caution, may leak sensitive data in proddef func(a, b):return a / bdef nested(c):try:func(5, c)except ZeroDivisionError:logger.exception("What?!")nested(0)

会导致:

2018-07-17 01:38:43.975 |错误| __main__: 演讲:10 - 什么?!
回溯(最近一次调用最后一次):文件“test.py”,第12行,位于 <module> 中演讲(0)└ <函数调用在 0x7f5c755322f0>> 文件“test.py”,第8行,曼哈顿函数(5,c)│ └ 0└ <0x7f5c79fc2e18 处的函数 func>文件“test.py”,第4行,在 func 中返回a/b│ └ 0└ 5ZeroDivisionError:除以零

请注意,由于帧数据不可用,此功能不适用于默认的Python REPL。

根据需要形成日志记录

想要对您的日志进行序列化以便解析或传送它们吗?使用该serialize参数,每条日志消息在发送到配置的接收器之前都将转换为 JSON 字符串。

logger.add(custom_sink_function, serialize=True)

bind()您可以通过修改附加的记录属性来将记录器消息放在上下文中。

logger.add("file.log", format="{extra[ip]} {extra[user]} {message}")
context_logger = logger.bind(ip="192.168.0.1", user="someone")
context_logger.info("Contextualize your logger easily")
context_logger.bind(user="someone_else").info("Inline binding of extra attribute")
context_logger.info("Use kwargs to add context during formatting: {user}", user="anybody")

可以使用以下命令临时修改上下文本地状态:contextualize()

with logger.contextualize(task=task_id):do_something()logger.info("End of task")

bind()您还可以通过组合和来对日志进行更细粒度的控制filter

logger.add("special.log", filter=lambda record: "special" in record["extra"])
logger.debug("This message is not logged to the file")
logger.bind(special=True).info("This message, though, is logged to the file!")

最后,该方法允许将动态值附加到每条新消息的记录字典中:patch()

logger.add(sys.stderr, format="{extra[utc]} {message}")
logger = logger.patch(lambda record: record["extra"].update(utc=datetime.utcnow()))

昂贵费用的评估

有时您想在生产过程中记录信息而不是损失,您可以使用详细的方法来实现这一点。opt()

logger.opt(lazy=True).debug("If sink level <= DEBUG: {x}", x=lambda: expensive_function(2**64))# By the way, "opt()" serves many usages
logger.opt(exception=True).info("Error stacktrace added to the log message (tuple accepted too)")
logger.opt(colors=True).info("Per message <blue>colors</blue>")
logger.opt(record=True).info("Display values from the record (eg. {record[thread]})")
logger.opt(raw=True).info("Bypass sink formatting\n")
logger.opt(depth=1).info("Use parent stack context (useful within wrapped functions)")
logger.opt(capture=False).info("Keyword arguments not added to {dest} dict", dest="extra")

可定制的级别

Loguru 附带了添加和的所有标准日志记录级别。您还需要更多吗?然后,只需使用该函数创建它即可。trace()success()level()

new_level = logger.level("SNAKY", no=38, color="<yellow>", icon="🐍")logger.log("SNAKY", "Here we go!")

更好的日期时间处理

标准日志记录因datefmtmsecs%(asctime)s%(created)s、没有时区信息的简单日期时间、不解读的格式等参数而构建聚合。Loguru修复了它:

logger.add("file.log", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}")

适用于脚本和库

在脚本中使用记录器很简单,您可以从一开始就使用它。要从库内部使用 Loguru,请记住永远不要调用相反的使用,以便日志记录函数设为无操作。如果开发人员希望查看您的库房日志,他们可以再次查看。configure()add()disable()enable()

# For scripts
config = {"handlers": [{"sink": sys.stdout, "format": "{time} - {message}"},{"sink": "file.log", "serialize": True},],"extra": {"user": "someone"}
}
logger.configure(**config)# For libraries, should be your library's `__name__`
logger.disable("my_library")
logger.info("No matter added sinks, this message is not displayed")# In your application, enable the logger in the library
logger.enable("my_library")
logger.info("This message however is propagated to the sinks")

为了更加方便,您还可以使用该库直接从配置文件进行设置。loguru-configlogger

与标准日志记录完全兼容

希望使用内置日志记录Handler作为 Loguru 接收器?

handler = logging.handlers.SysLogHandler(address=('localhost', 514))
logger.add(handler)

需要将Loguru消息传播到标准日志记录吗?

class PropagateHandler(logging.Handler):def emit(self, record):logging.getLogger(record.name).handle(record)logger.add(PropagateHandler(), format="{message}")

想要拦截发送至Loguru接收器的标准日志消息吗?

class InterceptHandler(logging.Handler):def emit(self, record):# Get corresponding Loguru level if it exists.try:level = logger.level(record.levelname).nameexcept ValueError:level = record.levelno# Find caller from where originated the logged message.frame, depth = sys._getframe(6), 6while frame and frame.f_code.co_filename == logging.__file__:frame = frame.f_backdepth += 1logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

通过环境变量进行个性化默认设置

不喜欢默认的记录器格式?想要其他DEBUG颜色吗?没问题:

# Linux / OSX
export LOGURU_FORMAT="{time} | <lvl>{message}</lvl>"# Windows
setx LOGURU_DEBUG_COLOR "<green>"

方便的解析器

从生成的日志中提取特定信息通常很有用,这就是为什么 Loguru 提供了一种有助于处理日志和正则表达式的方法。parse()

pattern = r"(?P<time>.*) - (?P<level>[0-9]+) - (?P<message>.*)"  # Regex with named groups
caster_dict = dict(time=dateutil.parser.parse, level=int)        # Transform matching groupsfor groups in logger.parse("file.log", pattern, cast=caster_dict):print("Parsed:", groups)# {"level": 30, "message": "Log example", "time": datetime(2018, 12, 09, 11, 23, 55)}

观赏的通知程序

Loguru 可以轻松地与强大的库(必须单独安装)结合使用,方便在程序意外失败时接收电子邮件或发送许多其他类型的通知。notifiers

import notifiersparams = {"username": "you@gmail.com","password": "abc123","to": "dest@gmail.com"
}# Send a single notification
notifier = notifiers.get_notifier("gmail")
notifier.notify(message="The application is running!", **params)# Be alerted on each error message
from notifiers.logging import NotificationHandlerhandler = NotificationHandler("gmail", defaults=params)
logger.add(handler, level="ERROR")

 Python日志库Loguru教程(最人性化的Python日志模块) - 简书

相关文章:

酷炫的python日志库-loguru

Loguru是一个python的日志库&#xff0c;比logging更简单&#xff0c;好用&#xff0c;功能丰富。 GitHub - Delgan/loguru: Python logging made (stupidly) simple 安装 pip install loguru 特征 开箱即用&#xff0c;补样板没有处理程序&#xff0c;没有清理程序&#xff…...

html根据图片变换背景色

html根据图片变换背景色 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.item {width: 50%;height: 80vh;margin: 0 auto;border: 1px solid red;}</style> </head><body>…...

“深入探究JVM:揭秘Java虚拟机的工作原理“

标题&#xff1a;深入探究JVM&#xff1a;揭秘Java虚拟机的工作原理 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括JVM的架构、内存管理、垃圾回收机制以及即时编译等关键概念。通过详细解释这些概念&#xff0c;读者将能够…...

小程序的api使用 以及一些weui组件实列获取头像 扫码等

今日目标 响应式单位rpx小程序的生命周期 【重点】20%小程序框架 weui 【重点】 50%内置API 【重点】30%综合练习 1. 响应式rpx 1.1 rpx单位 rpx是微信小程序提出的一个尺寸单位&#xff0c;将整个手机屏幕宽度分为750份&#xff0c;1rpx 就是 1/750&#xff0c;避免不同手…...

海思ss928部署手写数字识别模型

大致流程--------------------------------------------------------------------------------------------------------------------- 模型转换---------------------------------------------------------------------------------------------------- 1&#xff1a;准备MNI…...

组学知识速递(五)|ChIP-seq知多少?

近段时间来&#xff0c;我们合作的ChIP-Seq技术发表的高分成功案例一篇接一篇&#xff0c;您是否心动了呢&#xff1f;本篇文章&#xff0c;总结了ChIP-Seq实验部分重点知识点&#xff0c;开启ChIP-Seq的你绝不要错过&#xff01; Q1 什么是ChIP-Seq&#xff1f; ChIP-Seq即染…...

2308C++内存序概略

参考 释放:在释放前的任意读写操作不能放在此操作之后. 获取:在获取后的任意读写操作不能放在此操作之前. 放松:只保证本操作的原子性,一般用于统计. 消费:在加载后的依赖本原子变量的,都不能重排在本操作之前. 获取释放:获取释放 序列一致,完全一致....

【C++】string的使用

1、string的使用 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;void Test1() {string s1;string s2("hello");cin >> s1;cout << s1 << endl;//strcat【字符串拼接】string ret1 s…...

Android 周期任务

AlarmManager使用 1.创建意图 // 创建意图&#xff0c;启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…...

【游戏客户端】制作你玩我猜Like玩法

【游戏客户端】制作你玩我猜Like玩法 大家好&#xff0c;我是Lampard猿奋~~ “你画我猜”相信大家都不陌生&#xff0c;当初这款小游戏可谓茶余饭后必玩之选&#xff0c;风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…...

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

栈和队列详解(1)

目录 一、什么是栈&#xff1f; 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…...

苏州OV泛域名RSA加密算法https

RSA加密算法是一种非对称加密算法&#xff0c;它被广泛应用于信息安全领域。与对称加密算法不同&#xff0c;RSA加密算法使用了两个密钥&#xff0c;一个公钥和一个私钥。公钥可以公开&#xff0c;任何人都可以使用它加密信息&#xff0c;但只有私钥的持有者才能解密信息。RSA加…...

凯迪正大—微机继电保护校验仪

一、继电保护测试仪产品概述 KDJB-802继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件&#xff08;讨论稿&#xff09;》的基础上&#xff0c;听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代的微电子技术和器件实现的一种新…...

Linux文件属性与权限管理(可读、可写、可执行)

Linux把所有文件和设备都当作文件来管理&#xff0c;这些文件都在根目录下&#xff0c;同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情&#xff1a; 1、每行代表一个文件&#xff0c;每行的第一个字符代表文件类型&#xff0c;linux文件类型包括&am…...

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…...

酒吧座位全解析 小白必看

相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分&#xff0c;下面我简单解说一下&#xff0c;如有错漏&#xff0c;欢迎指正&#xff01;一、吧台吧台是酒吧的核心部位&#xff0c;走进酒吧门&#xff0c;首先映入眼帘的就是吧台&#xff0c;一排人围着吧台几…...

DAY19

题目一 空间尝试模型 一个样本做行一个样本做列 范围尝试模型 以....做分隔 dp[i][j] 为以i为左界限 以j为右界限 求这个范围内的计算值(不对 是方法数) 这& | ^ 都是双目运算符 观察一下规律 整体字符数量一定为奇数(包括运算符和数字) 对应到数组中 数组的位一定是偶数…...

Data analysis|Tableau基本介绍及可实现功能

一、基础知识介绍 &#xff08;一&#xff09;什么是tableau tableau 成立于 2003 年&#xff0c;是斯坦福大学一个计算机科学项目的成果&#xff0c;该项目旨在改善分析流程并让人们能够通过可视化更轻松地使用数据。Tableau可以帮助用户更好地理解和发现数据中的价值&#x…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...