一般情况下我们记录日志经常用到的是 logging 模块,在使用前我们需要配置模板,设置 Handler、Formatter 来预处理,例如日志输出位置、输出格式、日志分块和备份等。在不同项目使用日志时,前期需要进行 logger 的配置工作,相比较今天得到 的新技能个人感觉配置较繁琐。
新技能就是"Delgan/loguru",Loguru是一个旨在在Python中带来愉快日志记录的库。
本篇我们从四方面介绍 Loguru:
1、与 logging 区别,为什么 loguru"香"
2、安装
3、快速使用
4、高阶用法简介
一、与 logging 区别,为什么 loguru"香"
| 伐木 | 洛古鲁 |
---|---|---|
相同 | 提供简洁、灵活地事件记录功能 | |
不同 | 需要显式实例化logger,并使用Handler,Formatte,Filter | 减少配置步骤,add函数统治所有 |
二、安装
老规矩,第一步安装库,在 python3 环境下,直接 pip3 安装即可:
pip3 install loguru
三、快速使用
安装成功之后,我们就可以开始啦
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru import logger
logger.<span style="color:#78a960">debug</span>(<span style="color:#880000">"This is Debug"</span>)</span></span>
不需要繁琐的配置,开箱即"食",so easy
loguru 中主要对象就是 logger,有且只有 loguru,为何不需要配置就可使用呢,那是因为这些配置已经前置啦,输出格式化,文本颜色等,控制台输出如下:
输出内容包括时间、级别、模块名、行号以及日志信息,另外其输出还是彩色的,看起来会更加友(xuan)好(ku)
那如何 DIY 个性化定制专属日志呢,我们看看下一章吧
四、高阶用法简介
我们主要看看 loguru.logger 的"万能"add()
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>def</strong></span> <span style="color:#880000"><strong>add</strong></span>(
self,
sink,
*,
level=_defaults.LOGURU_LEVEL,
format=_defaults.LOGURU_FORMAT,
filter=_defaults.LOGURU_FILTER,
colorize=_defaults.LOGURU_COLORIZE,
serialize=_defaults.LOGURU_SERIALIZE,
backtrace=_defaults.LOGURU_BACKTRACE,
diagnose=_defaults.LOGURU_DIAGNOSE,
enqueue=_defaults.LOGURU_ENQUEUE,
catch=_defaults.LOGURU_CATCH,
**kwargs
):
<span style="color:#333333"><strong>pass</strong></span></span></span>
从源码中可以看出,add 参数很多,如 level、format、filter、color 等等,我们重点看看 sink 参数
接收器 :|类似文件的对象|_、|str|、|路径|、|可调用|_、|coroutine 函数|_ 或 |处理程序|
负责接收格式化的日志记录消息并将其传播到
适当的终结点。
(1)支持文件对象
(2)可以直接传入一个 字符串或者 对象str
pathlib.Path
(3)可以是一个 logging 模块中的 Handler
(4)可以是一个类或方法
下面我们就试试吧
(一)保存输出日志到文件
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru import logger
logger.add(<span style="color:#880000">"test_loguru_{time}.log"</span>) <span style="color:#888888"># 在add定义输出的文件名</span>
logger.<span style="color:#78a960">debug</span>(<span style="color:#880000">"This is Debug"</span>)</span></span>
控制台输出
文件输出到当前工程目录下
文件内容
(二)支持日志大小分割、日志保留时间定义
按日志大小、时间(小时、周)创建
旋转 : |str|, |int|, |time|, |timedelta|或|可调用|_,可选
指示何时应关闭当前日志文件和应关闭新文件的条件
开始。
配置日志保留最长时间
保留 : |str|, |int|, |timedelta|或|可调用|_,可选
一个指令,用于筛选在旋转或结束时应删除的旧文件
程序。
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru import logger
logger.<span style="color:#333333"><strong>add</strong></span>(<span style="color:#880000">"test_loguru_{time}.log"</span>, rotation=<span style="color:#880000">"1MB"</span>) <span style="color:#1f7199"># 每个文件大小1MB.超过创建新文件</span>
logger.<span style="color:#333333"><strong>add</strong></span>(<span style="color:#880000">"test_loguru_{time}.log"</span>, rotation=<span style="color:#880000">"12:00 "</span>) <span style="color:#1f7199"># 每天12点创建新文件</span>
logger.<span style="color:#333333"><strong>add</strong></span>(<span style="color:#880000">"test_loguru_{time}.log"</span>, rotation=<span style="color:#880000">"1 week"</span>) <span style="color:#1f7199"># 每周创建新文件</span></span></span>
(三)支持日志时间自定义
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru import logger
logger.add(<span style="color:#880000">"test_loguru_{time}.log"</span>, format=<span style="color:#880000">"{time:YYYY-MM-DD A HH:mm:ss.SSSS} | {level} | {name} | {message}"</span>,level=<span style="color:#880000">"DEBUG"</span>, rotation=<span style="color:#880000">"500MB"</span>, retention=<span style="color:#880000">"1 days"</span>)
logger.<span style="color:#78a960">info</span>(<span style="color:#880000">"This is INFO"</span>)</span></span>
(四)支持代码异常追踪
回溯跟踪(bool,可选) – 格式化的异常跟踪是否应向上扩展,超出捕获点,以显示生成错误的完整堆栈跟踪。
诊断(bool,可选)– 异常跟踪是否应显示变量值以简化调试。在生产环境中,这应设置为 False,以避免泄露敏感数据。
1、在 add 参数中设置
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru <span style="color:#333333"><strong>import</strong></span> logger
logger.add(<span style="color:#880000">"test_loguru_{time}.log"</span>, format=<span style="color:#880000">"{time} | {level} | {name} | {message}"</span>, level=<span style="color:#880000">"DEBUG"</span>,
rotation=<span style="color:#880000">"1 KB"</span>, retention=<span style="color:#880000">"10 seconds"</span>, encoding=<span style="color:#880000">"utf-8"</span>, backtrace=<span style="color:#333333"><strong>True</strong></span>, diagnose=<span style="color:#333333"><strong>True</strong></span>)
<span style="color:#333333"><strong>def</strong></span> <span style="color:#880000"><strong>test</strong></span>(num_list):
<span style="color:#333333"><strong>try</strong></span>:
<span style="color:#333333"><strong>for</strong></span> num <span style="color:#333333"><strong>in</strong></span> num_list:
logger.info(f<span style="color:#880000">"This Number is "</span> + num)
<span style="color:#333333"><strong>except</strong></span> Exception <span style="color:#333333"><strong>as</strong></span> e:
logger.exception(e)
<span style="color:#333333"><strong>if</strong></span> __name__ == <span style="color:#880000">"__main__"</span>:
l = [<span style="color:#880000">1</span>, <span style="color:#880000">2</span>, <span style="color:#880000">3</span>]
test(num_list=l)</span></span>
控制台输出
日志文件内容
2、使用装饰器直接 Traceback 记录
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>from</strong></span> loguru <span style="color:#333333"><strong>import</strong></span> logger
logger.add(<span style="color:#880000">"test_loguru_{time}.log"</span>, format=<span style="color:#880000">"{time} | {level} | {name} | {message}"</span>, level=<span style="color:#880000">"DEBUG"</span>,
rotation=<span style="color:#880000">"1 KB"</span>, retention=<span style="color:#880000">"10 seconds"</span>, encoding=<span style="color:#880000">"utf-8"</span>)
<span style="color:#1f7199">@logger.catch</span>
<span style="color:#333333"><strong>def</strong></span> <span style="color:#880000"><strong>test</strong></span>(num_list):
<span style="color:#333333"><strong>for</strong></span> num <span style="color:#333333"><strong>in</strong></span> num_list:
logger.info(f<span style="color:#880000">"This Number is "</span> + num)
<span style="color:#333333"><strong>if</strong></span> __name__ == <span style="color:#880000">"__main__"</span>:
l = [<span style="color:#880000">1</span>, <span style="color:#880000">2</span>, <span style="color:#880000">3</span>]
test(num_list=l)</span></span>
控制台输出
文件输出
至此,我们可以看出 Loguru 是很强大的,应用简洁,调试追踪直观,当然它还有很多强大功能,大家可以前往官网学习哈
参考资料:
github: https:// github.com/Delgan/logur u
loguru 帮助手册: https:// loguru.readthedocs.io/e n/stable/index.html