日志模块Loguru

2023-12-04 08:44
文章标签 模块 日志 loguru

本文主要是介绍日志模块Loguru,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装

Loguru 仅支持 Python 3.5 及以上的版本,使用 pip 安装即可:

pip install loguru

开箱即用

Loguru 的主要概念是只有一个:logger

from loguru import loggerlogger.info("This is log info!")
logger.warning("This is log warn!")
logger.error("This is log error!")
logger.debug("This is log debug!")

 控制台输出:

可以看到不需要手动设置,Loguru 会提前配置一些基础信息,自动输出时间、日志级别、模块名、行号等信息,而且根据等级的不同,还自动设置了不同的颜色,方便观察,真正做到了开箱即用!

add() / remove()

如果想自定义日志级别,自定义日志格式,保存日志到文件该怎么办?与 logging 模块不同,不需要 Handler,不需要 Formatter,只需要一个 add() 函数就可以了,例如我们想把日志储存到文件:

from loguru import loggerlogger.add('test.log')
logger.debug('this is a debug')

我们不需要像 logging 模块一样再声明一个 FileHandler 了,就一行 add() 语句搞定,运行之后会发现目录下 test.log 里面同样出现了刚刚控制台输出的 debug 信息。

 add() 语句相反,remove() 语句可以删除我们添加的配置:

from loguru import loggerlog_file = logger.add('test.log')
logger.debug('This is log debug!')
logger.remove(log_file)
logger.debug('This is another log debug!')

此时控制台会输出两条 debug 信息:

2021-10-19 13:53:36.610 | DEBUG    | __main__:<module>:86 - This is log debug!
2021-10-19 13:53:36.611 | DEBUG    | __main__:<module>:88 - This is another log debug!

基本参数释义:

sink:可以是一个 file 对象,例如 sys.stderropen('file.log', 'w'),也可以是 str 字符串或者 pathlib.Path 对象,即文件路径,也可以是一个方法,可以自行定义输出实现,也可以是一个 logging 模块的 Handler,比如 FileHandlerStreamHandler 等,还可以是 coroutine 、function,即一个返回协程对象的函数等。
 

level:日志输出和保存级别。
 

format:日志格式模板。
 

filter:一个可选的指令,用于决定每个记录的消息是否应该发送到 sink。
 

colorize:格式化消息中包含的颜色标记是否应转换为用于终端着色的 ansi 代码,或以其他方式剥离。 如果没有,则根据 sink 是否为 tty(电传打字机缩写) 自动做出选择。
 

serialize:在发送到 sink 之前,是否应首先将记录的消息转换为 JSON 字符串。
 

backtrace:格式化的异常跟踪是否应该向上扩展,超出捕获点,以显示生成错误的完整堆栈跟踪。

diagnose:异常跟踪是否应显示变量值以简化调试。建议在生产环境中设置 False,避免泄露敏感数据。
 

enqueue:要记录的消息是否应在到达 sink 之前首先通过多进程安全队列,这在通过多个进程记录到文件时很有用,这样做的好处还在于使日志记录调用是非阻塞的。
 

catch:是否应自动捕获 sink 处理日志消息时发生的错误,如果为 True,则会在 sys.stderr 上显示异常消息,但该异常不会传播到 sink,从而防止应用程序崩溃。
 

**kwargs:仅对配置协程或文件接收器有效的附加参数(见下文)。
当且仅当 sink 是协程函数时,以下参数适用:

loop:将在其中调度和执行异步日志记录任务的事件循环。如果为 None,将使用 asyncio.get_event_loop() 返回的循环。

当且仅当 sink 是文件路径时,以下参数适用:

rotation:一种条件,指示何时应关闭当前记录的文件并开始新的文件。

**retention **:过滤旧文件的指令,在循环或程序结束期间会删除旧文件。
 

compression:日志文件在关闭时应转换为的压缩或存档格式。

delay:是在配置 sink 后立即创建文件,还是延迟到第一条记录的消息时再创建。默认为 False。

mode:内置 open() 函数的打开模式,默认为 a(以追加模式打开文件)。
 

buffering:内置 open() 函数的缓冲策略,默认为1(行缓冲文件)。

encoding:内置 open() 函数的文件编码,如果 None,则默认为 locale.getpreferredencoding()。
 

**kwargs:其他传递给内置 open() 函数的参数。
这么多参数可以见识到 add() 函数的强大之处,仅仅一个函数就能实现 logging 模块的诸多功能,接下来介绍几个比较常用的方法。

rotation 日志文件分隔:

add() 函数的 rotation 参数,可以实现按照固定时间创建新的日志文件,比如设置每天 0 点新创建一个 log 文件:
 

logger.add('runtime_{time}.log', rotation='00:00')

设置超过 500 MB 新创建一个 log 文件:

logger.add('runtime_{time}.log', rotation="500 MB")

设置每隔一个周新创建一个 log 文件:

logger.add('runtime_{time}.log', rotation='1 week')

 retention 日志保留时间:

add() 函数的 retention 参数,可以设置日志的最长保留时间,比如设置日志文件最长保留 15 天:

logger.add('runtime_{time}.log', retention='15 days')

 设置日志文件最多保留 10 个:

logger.add('runtime_{time}.log', retention=10)

 也可以是一个 datetime.timedelta 对象,比如设置日志文件最多保留 5 个小时

import datetime
from loguru import loggerlogger.add('runtime_{time}.log', retention=datetime.timedelta(hours=5))

 compression 日志压缩格式

add() 函数的 compression 参数,可以配置日志文件的压缩格式,这样可以更加节省存储空间,比如设置使用 zip 文件格式保存:

logger.add('runtime_{time}.log', compression='zip')

 其格式支持:gzbz2xzlzmatartar.gztar.bz2tar.xz

字符串格式化

Loguru 在输出 log 的时候还提供了非常友好的字符串格式化功能,相当于 str.format()

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

输出:

2021-10-19 14:59:06.412 | INFO     | __main__:<module>:3 - If you are using Python 3.6, prefer f-strings of course!

 异常追溯

在 Loguru 里可以直接使用它提供的装饰器就可以直接进行异常捕获,而且得到的日志是无比详细的:

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

 日志输出:

2021-10-19 15:04:51.675 | ERROR    | __main__:<module>:10 - An error has been caught in function '<module>', process 'MainProcess' (30456), thread 'MainThread' (26268):
Traceback (most recent call last):> File "D:/python3Project\test.py", line 10, in <module>my_function(0, 0, 0)└ <function my_function at 0x014CDFA8>File "D:/python3Project\test.py", line 7, in my_functionreturn 1 / (x + y + z)│   │   └ 0│   └ 0└ 0ZeroDivisionError: division by zero

在控制台的输出是这样的:

来源:Loguru:Python 日志终极解决方案_logru retention-CSDN博客

这篇关于日志模块Loguru的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/452847

相关文章

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit