python 日志之loguru
介绍
在 Python 中,通常我们使用自带的 logging 模块来记录日志,但需要配置 Handler、Formatter 等,步骤很繁琐。现在我们有了新的选择—loguru。
安装
开箱即用,无需样板
首先,这个库的安装方式很简单,就用基本的 pip 安装即可,Python 3 版本的安装如下:
安装完毕之后,我们就可以在项目里使用这个 loguru 库了。
输出如下
以下是具有默认严重性值的标准级别,每个级别都与同名的日志记录方法相关联:
级别名称 | 严重性值 | 记录器方法 |
---|---|---|
TRACE |
5 | logger.trace() |
DEBUG |
10 | logger.debug() |
INFO |
20 | logger.info() |
SUCCESS |
25 | logger.success() |
WARNING |
30 | logger.warning() |
ERROR |
40 | logger.error() |
CRITICAL |
50 | logger.critical() |
在 IDE 或终端运行时会发现,loguru 在输出的不同级别信息时,带上了不同的颜色,使得结果更加直观,其中也包含了时间、级别、模块名、行号以及日志信息。
logger 默认采用 sys.stderr 标准输出将日志输出到控制台中,并没有输出到其他的地方,如果想要输出到其他的位置,比如存为文件,我们只需要使用一行代码声明即可。 例如将结果同时输出到一个 runtime.log 文件里面,可以这么写:
不需要再声明一个 FileHandler 了,就一行 add 语句搞定,运行之后会发现目录下 runtime.log 里面同样出现了刚刚控制台输出的 DEBUG 信息
详细使用
loguru 对输出到文件的配置有非常强大的支持,比如支持输出到多个文件,分级别分别输出,过大创建新文件,过久自动删除等等。 下面我们分别看看这些怎样来实现,这里基本上就是 add 方法的使用介绍。因为这个 add 方法就相当于给 logger 添加了一个 Handler,它给我们暴露了许多参数来实现 Handler 的配置,下面我们来详细介绍下。 首先看看它的方法定义吧:
看看它的源代码,它支持这么多的参数,如 level、format、filter、color 等等,另外我们还注意到它有个非常重要的参数 sink,我们看看官方文档
-
sink 可以传入一个 file 对象,例如
sys.stderr
或者open('file.log', 'w')
都可以。 -
sink 可以直接传入一个
str
字符串或者pathlib.Path
对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志输出进去。 -
sink 可以是一个方法,可以自行定义输出实现。
-
sink 可以是一个 logging 模块的 Handler,比如 FileHandler、StreamHandler 等等,这样就可以实现自定义 Handler 的配置。
-
colorize(
bool
,可选)– 格式化消息中包含的颜色标记是否应转换为 ansi 代码以进行终端着色,还是以其他方式剥离。如果 ,则根据汇是不是 tty 来自动做出选择。None
-
serialize(
bool
,可选)– 在将记录的消息及其记录发送到接收器之前,是否应首先将其转换为 JSON 字符串。 -
backtrace (
bool
,可选)– 是否应向上扩展格式化的异常跟踪,超出捕获点,以显示生成错误的堆栈跟踪。 -
diagnose(
bool
,可选)– 异常跟踪是否应显示变量值以简化调试。这应在生产中设置为,以避免泄漏敏感数据。False
-
enqueue (
bool
,可选)– 要记录的消息在到达接收器之前是否应首先通过多进程安全队列。这在通过多个进程记录到文件时很有用。这还具有使日志记录调用非阻塞的优点。 -
catch(
bool
,可选)– 是否应自动捕获接收器处理日志消息时发生的错误。如果 ,则会在sys.stderr
上显示异常消息,但该异常不会传播到调用方,从而防止应用崩溃。True
-
**kwargs – 仅对配置协程或文件接收器有效的其他参数(见下文)。
如果当接收器(sink)是文件路径( pathlib.Path )时,可以应用下列参数,同时add() 会返回与所添加的接收器相关联的标识符:
基本参数
下面我们再了解下它的其他参数,例如 format、filter、level 等等。 其实它们的概念和格式和 logging 模块都是基本一样的了,例如这里使用 format、level 来规定输出的格式:
控制台:
日志文件:
sink的删除操作
添加 sink 之后我们也可以对其进行删除,相当于重新刷新并写入新的内容。
删除的时候根据刚刚 add 方法返回的 id 进行删除即可,看下面的例子:
看这里,我们首先 add 了一个 sink,然后获取它的返回值,赋值为 i 。随后输出了一条日志,然后将i 变量传给remove 方法,再次输出一条日志,看看结果是怎样的。
控制台输出如下:
日志文件 runtime.log 内容如下:
可以发现,在调用 remove 方法之后,确实将历史 log 删除了。但实际上这并不是删除,只不过是将 sink 对象移除之后,在这之前的内容不会再输出到日志中。 这样我们就可以实现日志的刷新重新写入操作。
rotation配置
用了 loguru 我们还可以非常方便地使用 rotation 配置,比如我们想一天输出一个日志文件,或者文件太大了自动分隔日志文件,我们可以直接使用 add 方法的 rotation 参数进行配置。 我们看看下面的例子:
通过这样的配置我们就可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个 log 文件。我们在配置 log 名字时加上了一个 time 占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。 另外我们也可以使用 rotation 参数实现定时创建 log 文件,例如:
这样就可以实现每天 0 点新创建一个 log 文件输出了。 另外我们也可以配置 log 文件的循环时间,比如每隔一周创建一个 log 文件,写法如下:
这样我们就可以实现一周创建一个 log 文件了。
retention 配置
很多情况下,一些非常久远的 log 对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。retention 这个参数可以配置日志的最长保留时间。 比如我们想要设置日志文件最长保留 10 天,可以这么来配置:
Examples: “1 week, 3 days”, “2 months”
这样 log 文件里面就会保留最新 10 天的 log,妈妈再也不用担心 log 沉积的问题啦。
compression配置
loguru 还可以配置文件的压缩格式,比如使用 zip 文件格式保存,示例如下:
对应于压缩或存档的文件扩展名。这可以是以下之一: “gz”, “bz2”, “xz”, “lzma”, “tar”, “tar.gz”, “tar.bz2”,“tar.xz”, “zip”
enqueue配置
loguru可以配置在多进程同时往日志文件写日志的时候使用队列达到异步功效。
要记录的消息是否应在到达接收器之前首先通过多进程安全队列。这在通过多个进程记录到文件时很有用。这还具有使日志记录调用非阻塞的优点。
字符串格式化
loguru 在输出 log 的时候还提供了非常友好的字符串格式化功能,像这样:
输出:
异常捕获
catch装饰器 方法
在很多情况下,如果遇到运行错误,而我们在打印输出 log 的时候万一不小心没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。
但用了 loguru 之后,我们用它提供的装饰器就可以直接进行 Traceback 的记录,类似这样的配置即可:
我们做个测试,我们在调用时三个参数都传入 0,直接引发除以 0 的错误,看看会出现什么情况
运行完毕之后,可以发现 log 里面就出现了 Traceback 信息,而且给我们输出了当时的变量值,真的是不能再赞了!结果如下:
exception 方法
通过exception方法也可以实现异常的捕获与记录:
记录的日志信息如下所示:
Loguru简单的封装使用
或者使用
------------ 文章作者: shibuyu 本文链接: https://www.shibuyu.fun/archives/优雅的日志记录方案之loguru 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 师不予的测试Blog!
本文来自博客园,作者:测试玩家勇哥,转载请注明原文链接:https://www.cnblogs.com/Nephalem-262667641/articles/17275789.html