loguru——Python优雅日志包
参考文档:
- 『Python』优雅的记录日志——loguru
- Github:Delgan / loguru
- Python - 日志管理模块: Loguru的使用
- Python 中更优雅的日志记录方案 loguru【推荐】
- Python日志库loguru——轻松记日志,一个函数搞定【强烈推荐】
常用用法(其他用法与细节,参考以上文档):
from loguru import logger
import sys
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
logger.add("file_{time}.log")
logger.debug('this is a debug')
运行结果:
log文件如下:
需求:新建一个日志文件夹,定时清除过期日志。demo如下:
from loguru import logger
logger.add("./logs/detail.log",
level="INFO",
encoding="utf-8",
format="{level} | {time:YY-MM-DD HH:mm:ss} | {file} | {line} | {message}",
rotation="00:00",
retention="7 days")
logger.add("./logs/error.log",
level="ERROR",
encoding="utf-8",
format="{level} | {time:YY-MM-DD HH:mm:ss} | {file} | {line} | {message}",
rotation="00:00",
retention="7 days")
logger.info("今天下雨了")
logger.error("肚子痛,好难受!")
运行结果:
踩过的一个大坑:python,loguru日志递增式的重复打印,且无法保存为不同的日志文件
- 封装loguru.logger为一个类,并用其他子类来继承父类,目的:不同功能的日志保存在不同的日志文件中。
- 结果:控制台正常打印日志,但是日志文件会出现重复打印结果,并且是递增式地重复,极速增大日志内存,风险很大;同时不同日志文件中的日志结果是一样的。
- 原因分析:
-
A. 解释为啥日志结果一样:logger_1、logger_2和logger_3跟logger指向的是同一个对象【就算是封装,也少不了xxx = logger】。这些”变量”只不过是这个对象的名字而已,所以代码本质上就是给logger这个名字对应的对象绑定了几个文件,自然每个文件的内容都是完全一样的。但是单独运行子功能代码肯定是没有问题的,一旦存在日志文件相互调用,就会出现问题。
-
B. 解释为啥日志结果递增式重复:loguru全局只有一个logger,logging可以通过名字的不同创建多个,所以每出现一次,就会存在递增式重复调用。
-
C. 解释真的无法分开保存吗?答:不是,可以配置filter,但是需要对每个输出日志进行过滤判断,违背了保存日志的初衷,得不偿失。
- 解决措施:主函数配置好日志文件的保存路径后,调用子模块中的loguru.logger,就不要再在子模块中添加日志文件配置了。强迫症表示很难受,对吧?
- 总结:logger与loguru的区别是什么?
A. 从安装来看,logging不需要安装,loguru需要安装;
B. 从配置的角度,loguru全局只有一个logger,logging可以通过名字的不同创建多个;
C. 配置loguru相比配置logging更加简便;
D. 其他模块的支持,这里面其他模块指定是import 的其他模块,比如,系统中import peewee,在peewee中使用了logging模块,如果想要打印peewee中的日志,logging可以通过配置打印出来,而loguru是不支持的。