Loguru 更易使用的日志模块(一)
1 关于Loguru
在python中,和Logging一样,Loguru也是用来记录日志的,但是Loguru使用起来更加简单,更容易上手
在Loguru中,要知道的唯一的概念就是logger, 通过logger, 几乎就能完成你想要记录日志的所有事情,不像Logging,记录日志需要添加Handler、Formattet、Filter
2 Loguru的用法
2.1 基础用法
Loguru是第三方包,使用前需要安装
pip install loguru #安装
pip show logure #安装后,查看相关信息
如上,直接用logger调用不同级别的方法的方法即可, 不需要像logging要去创建logger
默认情况下,Loguru是通过sys.stderr将标准错误输出输出到控制台,当然,输出目的可以配置更改的
2.2 logger.add()和logger.remove(): 定义日志输出时的行为
要达到logging中的Handler(日志输出地)、Formattetr(日志输出格式)、Filter(过滤输出的日志数据的效果,以及定义输出日志级别等等,全都可以在logger.add()这一个函数中完成
控制台
文件
有add()就有remove(),add()函数定义了日志输出行为后,会返回一个int类型的id,remove()函数通过这个id就可以删除之前在add()函数中所定义的东西
控制台
文件
文件的日志内容是空白的
remove(handler_id=None): 会删除之前所有add()中自定义的东西,包括Loguru的默认配置
控制台现在 不会输出任何数据
文件输出
2.2.1 add(xx)中的参数
- sink:可以传入一个 file 对象(file-like object),或一个 str 字符串或者 pathlib.Path 对象,或一个方法(coroutine function),或 logging 模块的 Handler(logging.Handler)。
- level (int or str, optional) :应将已记录消息发送到接收器的最低严重级别。
- format (str or callable, optional) :格式化模块,在发送到接收器之前,使用模板对记录的消息进行格式化。
- filter (callable, str or dict, optional) :用于决定每个记录的消息是否应该发送到接收器。
- colorize (bool, optional) – 是否应将格式化消息中包含的颜色标记转换为用于终端着色的Ansi代码,或以其他方式剥离。如果None,根据水槽是否为TTY自动作出选择。
- serialize (bool, optional) :在发送到接收器之前,记录的消息及其记录是否应该首先转换为JSON字符串。
- backtrace (bool, optional) :格式化的异常跟踪是否应该向上扩展,超出捕获点,以显示生成错误的完整堆栈跟踪。
- diagnose (bool, optional) :异常跟踪是否应该显示变量值以简化调试。在生产中,这应该设置为“False”,以避免泄漏敏感数据。
- enqueue (bool, optional) :要记录的消息在到达接收器之前是否应该首先通过多进程安全队列。当通过多个进程将日志记录到文件中时,这是非常有用的。这还具有使日志调用非阻塞的优点。
- catch (bool, optional) :是否应该自动捕获接收器处理日志消息时发生的错误。如果True上显示异常消息 sys.stderr。但是,异常不会传播到调用者,从而防止应用程序崩溃
如果当接收器(sink)是文件路径( pathlib.Path )时,可以应用下列参数
- rotation:分隔日志文件,何时关闭当前日志文件并启动一个新文件的条件,;例如,"500 - MB"、"0.5 GB"、"1 month 2 weeks"、"10h"、"monthly"、"18:00"、"sunday"、"monday at 18:00"、"06:15"
- retention (str, int, datetime.timedelta or callable, optional) ,可配置旧日志的最长保留时间,例如,"1 week, 3 days"、"2 months"
- compression (str or callable, optional) :日志文件在关闭时应转换为的压缩或归档格式,例如,"gz"、"bz2"、"xz"、"lzma"、"tar"、"tar.gz"、"tar.bz2"、"tar.xz"、"zip"
- delay (bool, optional):是否应该在配置了接收器之后立即创建文件,或者延迟到第一个记录的消息。默认为' False '。
- mode (str, optional) :与内置open()函数一样的打开模式。默认为' "a"(以附加模式打开文件)。
- buffering (int, optional) :内置open()函数的缓冲策略,它默认为1(行缓冲文件)。
- encoding (str, optional) :文件编码与内置的' open() '函数相同。如果' None ',它默认为'locale.getpreferredencoding()
参数具体见文档
具体见 https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add
2.2.1.1 add()中format参数: 定义日志输出格式
控制台输出
如上,format参数字段的值是一个字符串模板,模板中可用的字段如下,字段与字段间的连接符可自定义
2.2.1.2 add()filter参数: 定义输出或不输出哪些日志数据
filter可接受一个字符串、函数、字典
字符串
loguru_a.py
loguru_b.py
控制台输出
如上,只是输出了b文件的日志数据,filter为字符串时,只会输出指定模块和指定模块的子模块中的数据
字典
loguru_b.py
控制台输出:
如上,为字典时, 可指定每个的输出标准,标准为True或False,表示输出或不输出该模块的日志
,标准为日志级别时,表示该模块输出日志的最低级别
如果字典中key为空字符串"",表示所有模块,它的值即为所有模块的默认值
函数
loguru_b.py
控制台输出
如上,所有的日志数据都作为参数record传递进去,函数返回值为True的数据会被输出,为False则不输出
2.2.1.3 add()中的level参数: 定义输出日志的最低级别
loguru_b.py
控制台输出
默认的日志级别如下
2.3 在日志中记录异常
2.3.1 @logger.catch: 在日志中自动记录任何异常
如上,利用装饰器@logger.catch不仅能将代码里的任何异常自动记录在日志,还能将发生异常处的相关数据记录下来供我们判断
2.3.2 logger.exception(xxx)
如上,logger.exception()也可以在异常处记录相关异常处理,但@logger.catch能自动记录它作用区域的任何未知异常,logger.exception则不能自动记录,只能是写在可能会有异常的地方,一旦发生相应异常才会记录
注意@logger.catch不但会自动记录任何未知异常,还会捕获住异常,不向上继续抛出异常
如上,在main函数中调用了会发生异常的函数,异常一旦发生没有被捕获,异常后面的代码则不会被执行(try exceppt中except部分例外),在使用@logger.catch,这里却执行了异常后面的主要代码
所以,@logger.catch虽然很方便,能自动记录任何未知的异常,但是也会捕获住任何未知异常,这可能是个坑,发生了异常却不知道
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性