loguru日志模块使用
loguru日志模块使用
相比于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()
-
控制台输出
from loguru import logger @logger.catch def add(x, y, z): return 1 / (x + y + z) # logger.remove() # 取消注释将不会打印到控制台上 logger.add("debug.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="DEBUG", filter=lambda x: "DEBUG" in str(x['level']).upper()) logger.add("info.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="INFO", filter=lambda x: "INFO" in str(x['level']).upper()) logger.add("error.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="ERROR", filter=lambda x: "ERROR" in str(x['level']).upper()) logger.add("warning.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="WARNING", filter=lambda x: "WARNING" in str(x['level']).upper()) if __name__ == '__main__': # trace = logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>") logger.info("That's it, beautiful and simple logging!") logger.debug("debug") logger.warning("This is new log") logger.info(f'If you are using Python {__file__}, prefer {__file__} of course!') add(0, 0, 0) logger.success("nice")