酷炫的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!")
更好的日期时间处理
标准日志记录因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…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
