相比于logging模块,loguru模块使用起来更方便,并且可以根据不同日志级别,进行不同颜色输出
一、安装
pip install loguru
二、基本使用
-
代码
from loguru import logger # logger.add(sys.stderr) 内部已默认执行,输出日志内容到控制台 logger.add('test.log', encoding='utf-8', level='ERROR') # 将ERROR及以上级别的日志输出到日志文件 logger.info('info') logger.debug('debug') logger.warning('warning') logger.error('error') logger.critical('critical')
-
控制台输出
-
test.log文件
2023-01-12 04:47:57.788 | ERROR | __main__:<module>:24 - error 2023-01-12 04:47:57.788 | CRITICAL | __main__:<module>:25 - critical
按照设置的日志级别,只保存了ERROR及以上级别日志内容
三、配置使用
-
概述
- 使用logger.add()方法就可以实现日志输出的配置,类比logging模块的handler
- 默认已经实现了logger.add(sys.stderr)方法,即控制台输出的handler,可通过logger.remove()方法清除已添加的handler
-
rotation参数
- 按照指定规则生成新的日志文件,避免单个日志文件过大
logger.add('./logs/test.log', encoding='utf-8', rotation='5 MB') # 文件超过5MB,就会新生成一个文件 logger.add('./logs/test.log', encoding='utf-8', rotation='1 week') # 一周后,会新生成一个文件,单位还可以是s等 logger.add('./logs/test.log', encoding='utf-8', rotation='17:44') # 每天的17:44生成新文件(注意:如果该时间段没有日志记录,则仍记录在原日志文件)
- 示例
import time from loguru import logger logger.add('./logs/test_{time}.log', encoding='utf-8', rotation='10 s') # 超过10s,则新建日志 for i in range(30): logger.info(f'test_{i}') time.sleep(1)
运行结束后,生成3个日志文件,{time}会生成当前的时间
- 按照指定规则生成新的日志文件,避免单个日志文件过大
-
retention参数
- 按照指定规则保留日志(即删除操作)
logger.add('./logs/test.log', encoding='utf-8', retention='10 days') # 该日志文件中,只保留最近10天的日志内容 logger.add('./logs/test.log', encoding='utf-8', rotation='5 MB', retention=2) # 保留最近3个文件
注意:retention取整数时,保留最近【int + 1】个文件
- 示例
from loguru import logger logger.add('./logs/test.log', encoding='utf-8', rotation='1 KB', retention=2) for i in range(100): logger.info(f'test_{i}')
当日志文件大小超过1 KB时,会新生成日志文件,同时旧的日志文件名会带上时间,最后保留最新的3个日志文件
- 按照指定规则保留日志(即删除操作)
-
compression参数
- 对日志文件进行压缩,节省空间
from loguru import logger logger.add('./logs/test.log', encoding='utf-8', rotation='10KB', compression='zip') for i in range(1000): logger.info(f'test_{i}')
上述示例中,首先日志文件超过10KB就会新建日志文件,然后对之前的文件进行zip压缩,压缩后大小为1KB
- 对日志文件进行压缩,节省空间
四、异常追溯
-
代码
from loguru import logger def test(): try: print(3 / 0) except ZeroDivisionError as e: logger.exception(e) if __name__ == "__main__": test()
-
控制台输出