Python记录日志模块推荐-loguru!
前言
在做项目的时候一直在用Python自带的模块logging,进行日志的记录,虽然他们满足我大部分的要求,但是还是有很多缺点,例如需要额外的配置、不能自动删除时间久的日志文件等等。
难道真的没有比较好的第三方模块吗。。。。。于是我在网上langlanglang.....咦?还真到了一个比较好的模块来记录日志。他就是今天我们的主角---loguru!!
一、安装loguru
pip install loguru
二、基本使用
from loguru import logger logger.debug('this is a debug message')
运行结果如下:
从结果可以得知,不需要配置什么东西,然后调用其 debug方法即可。在 loguru 里面有且仅有一个主要对象,那就是 logger.loguru 里面有且仅有一个 logger,而且它已经被提前配置了一些基础信息,比如比较友好的格式化、文本颜色信息等等。
三、详细使用
既然是日志,那么最常见的就是输出到文件了。loguru 对输出到文件的配置有非常强大的支持,比如支持输出到多个文件,分级别分别输出,过大创建新文件,过久自动删除等等。下面我们分别看看这些怎样来实现,这里基本上就是 add 方法的使用介绍。
1.输出日志到文件,记录日志的等级,编码格式
import os from loguru import logger # logger.debug('this is a debug message') BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 日志文件配置 LOG_DIR = os.path.join(BASE_DIR,'log') if os.path.exists(LOG_DIR) is False: os.makedirs(LOG_DIR) logger.add(os.path.join(LOG_DIR,'error.log'),encoding='utf-8',level="INFO")
2.rotation 配置
用了 loguru 我们还可以非常方便地使用rotation 配置,比如我们想一天输出一个日志文件,或者文件太大了自动分隔日志文件,我们可以直接使用 add 方法的 rotation 参数进行配置
#输出到文件"error2020-09-21_16-08-52_714738.log", logger.add(os.path.join(LOG_DIR,'error{time}.log'),rotation="500 MB",level="WARNING",encoding='utf-8')
通过这样的配置我们就可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个 log 文件。
我们在配置 log 名字时加上了一个 time 占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。
另外我们也可以使用 rotation 参数实现定时创建 log 文件,例如:
logger.add('runtime_{time}.log', rotation='00:00') #实现每天 0 点新创建一个 log 文件输出了。
另外我们也可以配置 log 文件的循环时间,比如每隔一周创建一个 log 文件,写法如下:
logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 week',encoding='utf-8') #实现 1 day 1 week 1 hour 即多久生成一个新的文件
3.retention 配置
很多情况下,一些非常久远的 log 对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。retention 这个参数可以配置日志的最长保留时间。
logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day',retention='30 days',encoding='utf-8')
这样log 文件里面就会保留最新 30 天的, log会自动清理一个月之前的日志
4.compression 配置
loguru 还可以配置文件的压缩格式,这样可以更加节省存储空间,比如使用 zip 文件格式保存,示例如下:
logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day', compression='zip',retention='30 days',encoding='utf-8')
5.enqueue配置
loguru可以配置在多进程同时往日志文件写日志的时候使用队列达到异步功效。
logger.add(os.path.join(LOG_DIR,'error.log'), enqueue=True) # 异步写入
6.Traceback 记录
在很多情况下,如果遇到运行错误,而我们在打印输出 log 的时候万一不小心没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。
但用了 loguru 之后,我们用它提供的装饰器就可以直接进行 Traceback 的记录,例如:
import os
from loguru import logger
# logger.debug('this is a debug message')
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志文件配置
LOG_DIR = os.path.join(BASE_DIR,'log')
if os.path.exists(LOG_DIR) is False:
os.makedirs(LOG_DIR)
logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day',retention='30 days',encoding='utf-8',level="INFO")
@logger.catch
def func():
print(a)
func()
logger.warning("程序走到这里了")
error.log日志文件如下:
2020-09-24 16:50:58.398 | ERROR | __main__:<module>:17 - An error has been caught in function '<module>', process 'MainProcess' (42920), thread 'MainThread' (42252): Traceback (most recent call last): > File "D:/project/loguru_demo.py", line 17, in <module> func() └ <function func at 0x00000261BF734268> File "D:/project/loguru_demo.py", line 15, in func print(a) NameError: name 'a' is not defined 2020-09-24 16:50:58.792 | WARNING | __main__:<module>:18 - 程序走到这里了
很明显,程序的报错位置追踪到了,也没有影响程序接下来的正常运行。