python3中超级好⽤的⽇志模块-loguru模块详解
⼀. 使⽤logging模块时
⽤python写代码时,logging模块最基本的⼏⾏配置,如下:
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = Logger(__name__)
logger.info('this is another debug message')
logger.warning('this is another debug message')
<('this is another debug message')
logger.info('this is another debug message')
执⾏结果如下:
⼆. loguru模块的基础使⽤
如果想更简洁,可⽤loguru库,python3安装:pip3 install loguru。
loguru默认的输出格式是上⾯的内容,有时间、级别、模块名、⾏号以及⽇志信息,不需要⼿动创建 logger,直接使⽤即可,另外其输出还是彩⾊的,看起来会更加友好。
⽤法如下:
from loguru import logger
logger.debug('this is a debug message')
logger.info('this is another debug message')
logger.warning('this is another debug message')
<('this is another debug message')
logger.info('this is another debug message')
logger.success('this is success message!')
执⾏结果如下:
不需要配置什么东西,直接引⼊⼀个 logger,然后调⽤其 debug ⽅法即可。
如果想要输出到⽂件,只需要:
from loguru import logger
logger.add('my_log.log')
logger.debug('this is a debug')
运⾏之后会发现⽬录下 my_log.log 出现了刚刚控制台输出的 DEBUG 信息。上⾯只是基础⽤法,更详细的在下⾯
三. logurr详细使⽤
⽐如⽀持输出到多个⽂件,分级别分别输出,过⼤创建新⽂件,过久⾃动删除等等。
3.1 add ⽅法的定义
def add(
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,
python格式化输出formatenqueue=_defaults.LOGURU_ENQUEUE,
catch=_defaults.LOGURU_CATCH,
**kwargs
):
pass
看看它的源代码,它⽀持这么多的参数,如 level、format、filter、color 等等,另外我们还注意到它有个⾮常重要的参数 sink,我们看看官⽅⽂档:,可以了解到通过 sink 我们可以传⼊多种不同的数据结构,汇总如下:
sink 可以传⼊⼀个 file 对象,例如 sys.stderr 或者 open(‘file.log’, ‘w’) 都可以。
sink 可以直接传⼊⼀个 str 字符串或者 pathlib.Path 对象,其实就是代表⽂件路径的,如果识别到是这种类型,它会⾃动创建对应路径的⽇志⽂件并将⽇志输出进去。
sink 可以是⼀个⽅法,可以⾃⾏定义输出实现。
sink 可以是⼀个 logging 模块的 Handler,⽐如 FileHandler、StreamHandler 等等。
sink 还可以是⼀个⾃定义的类,具体的实现规范可以参见官⽅⽂档。
所以说,刚才我们所演⽰的输出到⽂件,仅仅给它传了⼀个 str 字符串路径,他就给我们创建了⼀个⽇志⽂件,就是这个原理。
3.2 基本参数
下⾯我们再了解下它的其他参数,例如 format、filter、level 等等。
其实它们的概念和格式和 logging 模块都是基本⼀样的了,例如这⾥使⽤ format、filter、level 来规定输出的格式:
logger.add('runtime.log',format="{time} {level} {message}",filter="my_module", level="INFO")
3.3 删除 sink
另外添加 sink 之后我们也可以对其进⾏删除,相当于重新刷新并写⼊新的内容。
删除的时候根据刚刚 add ⽅法返回的 id 进⾏删除即可,看下⾯的例⼦:
from loguru import logger
trace = logger.add('my_log.log')
logger.debug('this is a debug message')
logger.debug('this is another debug message')
看这⾥,我们⾸先 add 了⼀个 sink,然后获取它的返回值,赋值为 trace。随后输出了⼀条⽇志,然后将 trace 变量传给 remove ⽅法,再次输出⼀条⽇志,看看结果是怎样的。
控制台输出如下:
⽇志⽂件 my_log.log 内容如下:
可以发现,在调⽤ remove ⽅法之后,确实将历史 log 删除了。但实际上这并不是删除,只不过是将 sink 对象移除之后,在这之前的内容不会再输出到⽇志中。
这样我们就可以实现⽇志的刷新重新写⼊操作。
3.4 rotation 配置
⽤了 loguru 我们还可以⾮常⽅便地使⽤ rotation 配置,⽐如我们想⼀天输出⼀个⽇志⽂件,或者⽂件太⼤了⾃动分隔⽇志⽂件,我们可以直接使⽤ add ⽅法的 rotation 参数进⾏配置。
我们看看下⾯的例⼦:
logger.add('runtime_{time}.log', rotation="500 MB")
通过这样的配置我们就可以实现每 500MB 存储⼀个⽂件,每个 log ⽂件过⼤就会新创建⼀个 log ⽂件。我们在配置 log 名字时加上了⼀个 time 占位符,这样在⽣成时可以⾃动将时间替换进去,⽣成⼀个⽂件名包含时间的 log ⽂件。
另外我们也可以使⽤ rotation 参数实现定时创建 log ⽂件,例如:
logger.add('runtime_{time}.log', rotation='00:00')
这样就可以实现每天 0 点新创建⼀个 log ⽂件输出了。
另外我们也可以配置 log ⽂件的循环时间,⽐如每隔⼀周创建⼀个 log ⽂件,写法如下:
logger.add('runtime_{time}.log', rotation='1 week')
这样我们就可以实现⼀周创建⼀个 log ⽂件了。
3.5 retention 配置
很多情况下,⼀些⾮常久远的 log 对我们来说并没有什么⽤处了,它⽩⽩占据了⼀些存储空间,不清除掉就会⾮常浪费。retention 这个参数可以配置⽇志的最长保留时间。
⽐如我们想要设置⽇志⽂件最长保留 10 天,可以这么来配置:
logger.add('runtime.log', retention='10 days')
这样 log ⽂件⾥⾯就会保留最新 10 天的 log,妈妈再也不⽤担⼼ log 沉积的问题啦。
3.6 compression 配置
loguru 还可以配置⽂件的压缩格式,⽐如使⽤ zip ⽂件格式保存,⽰例如下:
logger.add('runtime.log', compression='zip')
这样可以更加节省存储空间。
3.7 字符串格式化
loguru 在输出 log 的时候还提供了⾮常友好的字符串格式化功能,像这样:
logger.info('If you are using Python {}, prefer {feature} of course!',3.6, feature='f-strings')
这样在添加参数就⾮常⽅便了。
3.8 Traceback 记录
在很多情况下,如果遇到运⾏错误,⽽我们在打印输出 log 的时候万⼀不⼩⼼没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。
但⽤了 loguru 之后,我们⽤它提供的装饰器就可以直接进⾏ Traceback 的记录,类似这样的配置即可:
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return1/(x + y + z)
我们做个测试,我们在调⽤时三个参数都传⼊ 0,直接引发除以 0 的错误,看看会出现什么情况:
my_function(0,0,0)
运⾏完毕之后,可以发现 log ⾥⾯就出现了 Traceback 信息,⽽且给我们输出了当时的变量值,真的
是不能再赞了!结果如下:
> File "run.py", line 15,in<module>
my_function(0,0,0)
└<function my_function at 0x1171dd510>
File "/private/var/py/logurutest/demo5.py", line 13,in my_function
return1/(x + y + z)
││└0
│└0
└0
ZeroDivisionError: division by zero
因此,⽤ loguru 可以⾮常⽅便地实现⽇志追踪,debug 效率可能要⾼上⼗倍了?
看完之后,是时候把⾃⼰的 logging 模块替换成 loguru 啦!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。