酷炫的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()stderr
logger.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!")
更好的日期时间处理
标准日志记录因datefmt
或msecs
、%(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的日志库,比logging更简单,好用,功能丰富。 GitHub - Delgan/loguru: Python logging made (stupidly) simple 安装 pip install loguru 特征 开箱即用,补样板没有处理程序,没有清理程序ÿ…...
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虚拟机的工作原理“
标题:深入探究JVM:揭秘Java虚拟机的工作原理 摘要:本文将深入探究Java虚拟机(JVM)的工作原理,包括JVM的架构、内存管理、垃圾回收机制以及即时编译等关键概念。通过详细解释这些概念,读者将能够…...

小程序的api使用 以及一些weui组件实列获取头像 扫码等
今日目标 响应式单位rpx小程序的生命周期 【重点】20%小程序框架 weui 【重点】 50%内置API 【重点】30%综合练习 1. 响应式rpx 1.1 rpx单位 rpx是微信小程序提出的一个尺寸单位,将整个手机屏幕宽度分为750份,1rpx 就是 1/750,避免不同手…...

海思ss928部署手写数字识别模型
大致流程--------------------------------------------------------------------------------------------------------------------- 模型转换---------------------------------------------------------------------------------------------------- 1:准备MNI…...

组学知识速递(五)|ChIP-seq知多少?
近段时间来,我们合作的ChIP-Seq技术发表的高分成功案例一篇接一篇,您是否心动了呢?本篇文章,总结了ChIP-Seq实验部分重点知识点,开启ChIP-Seq的你绝不要错过! Q1 什么是ChIP-Seq? 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.创建意图 // 创建意图,启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

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

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

分页查询从接口到实现,统一对日期类型进行格式化处理
编写Service实现类编写Mapper的sql,但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

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

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

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

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

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

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

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

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

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...