python loguru日志模块使用
相比于logging模块,loguru模块使用起来更方便,并且可以根据不同日志级别,进行不同颜色输出
一、安装
pip install loguru
二、基本使用
-
代码
from loguru import logger # logger.add(sys.stderr) 内部已默认执行,输出日志内容到控制台 # logger.remove(0) #删除默认处理程序的配置(其ID为0) # logger.add(sys.stderr, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name} | {line} | {message}") # 重新添加控制台日志输出格式 logger.add('test.log', encoding='utf-8', level='ERROR') # level参数指定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='00:00') # 每天的00:00生成新文件(注意:如果该时间段没有日志记录,则仍记录在原日志文件)
- 取值示例:"100 MB", "0.5 GB", "1 month 2 weeks", "4 days", "10h", "monthly", "18:00", "sunday", "w0", "monday at 12:00", ...
- 示例
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', rotation='5 MB', retention='1 week') # 只保留最近1周的文件 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个日志文件
- 按照指定规则保留日志(即删除操作)
-
format参数
- 可以自定义日志的格式
- 使用示例:
- 代码
import sys from loguru import logger logger.remove(0) # 取消默认处理方式 # 日志级别和消息级别按照对应颜色进行转换,其余使用绿色,{thread.name} => 线程名 format_ = '<g>{time:YYYY-MM-DD HH:mm:ss} |</g> <lvl>{level}</lvl> <g>| {name} | {line} | {thread.name} -</g> <lvl>{message}</lvl>' logger.add(sys.stderr, format=format_) logger.info('info') logger.debug('debug') logger.warning('warning') logger.error('error') logger.critical('critical')
- 控制台输出
- 代码
- 常见的key及其描述:
+------------+---------------------------------+----------------------------+ | Key | Description | Attributes | +============+=================================+============================+ | elapsed | 程序开始以来经过的时间 | 参见|timedelta| | +------------+---------------------------------+----------------------------+ | exception | 如果有异常则为格式化后的异常,否则为``None`` | ``type``, ``value``, ``traceback`` | +------------+---------------------------------+----------------------------+ | extra | 用户绑定的属性字典(参见|bind|) | None | +------------+---------------------------------+----------------------------+ | file | 进行日志调用的文件 | ``name`` (默认), ``path`` | +------------+---------------------------------+----------------------------+ | function | 进行日志调用的函数 | None | +------------+---------------------------------+----------------------------+ | level | 用于记录消息的严重程度 | ``name`` (默认), ``no``, ``icon`` | +------------+---------------------------------+----------------------------+ | line | 源代码中的行号 | None | +------------+---------------------------------+----------------------------+ | message | 记录的消息(尚未格式化) | None | +------------+---------------------------------+----------------------------+ | module | 进行日志调用的模块 | None | +------------+---------------------------------+----------------------------+ | name | 进行日志调用的``__name__`` | None | +------------+---------------------------------+----------------------------+ | process | 进行日志调用的进程 | ``name``, ``id`` (默认) | +------------+---------------------------------+----------------------------+ | thread | 进行日志调用的线程 | ``name``, ``id`` (默认) | +------------+---------------------------------+----------------------------+ | time | 进行日志调用时的本地时间 | 参见|datetime| | +------------+---------------------------------+----------------------------+
- 常见的颜色标签
以下是可用的标签(请注意,根据终端的兼容性可能会有所不同): +------------------------------------+--------------------------------------+ | 颜色(简称) | 样式(简称) | +====================================+======================================+ | 黑色(k) | 粗体(b) | +------------------------------------+--------------------------------------+ | 蓝色(e) | 暗淡(d) | +------------------------------------+--------------------------------------+ | 青色(c) | 正常(n) | +------------------------------------+--------------------------------------+ | 绿色(g) | 斜体(i) | +------------------------------------+--------------------------------------+ | 洋红色(m) | 下划线(u) | +------------------------------------+--------------------------------------+ | 红色(r) | 删除线(s) | +------------------------------------+--------------------------------------+ | 白色(w) | 反转(v) | +------------------------------------+--------------------------------------+ | 黄色(y) | 闪烁(l) | +------------------------------------+--------------------------------------+ | | 隐藏(h) | +------------------------------------+--------------------------------------+ 用法: +-----------------+-------------------------------------------------------------------+ | 描述 | 示例 | | +---------------------------------+---------------------------------+ | | 前景色 | 背景色 | +=================+=================================+=================================+ | 基本颜色 | ``<red>``, ``<r>`` | ``<GREEN>``, ``<G>`` | +-----------------+---------------------------------+---------------------------------+ | 浅色 | ``<light-blue>``, ``<le>`` | ``<LIGHT-CYAN>``, ``<LC>`` | +-----------------+---------------------------------+---------------------------------+ | 8位颜色 | ``<fg 86>``, ``<fg 255>`` | ``<bg 42>``, ``<bg 9>`` | +-----------------+---------------------------------+---------------------------------+ | 十六进制颜色 | ``<fg #00005f>``, ``<fg #EE1>`` | ``<bg #AF5FD7>``, ``<bg #fff>`` | +-----------------+---------------------------------+---------------------------------+ | RGB颜色 | ``<fg 0,95,0>`` | ``<bg 72,119,65>`` | +-----------------+---------------------------------+---------------------------------+ | 样式化 | ``<bold>``, ``<b>``, ``<underline>``, ``<u>`` | +-----------------+-------------------------------------------------------------------+
特殊标签``<level>``(用``<lvl>``缩写)根据配置的日志消息级别颜色进行转换。
-
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
- 可选压缩格式有:gz、bz2、xz、lzma、tar、tar.gz、tar.bz2、tar.xz、zip
- 对日志文件进行压缩,节省空间
-
filter参数
- 可以过滤不同类型的日志,输出指定类型日志到指定文件
from loguru import logger # 设置不同级别的日志输出文件 logger.add("debug.log", level="DEBUG", rotation="10 MB", filter=lambda record: record["level"].name == "DEBUG") logger.add("info.log", level="INFO", rotation="10 MB", filter=lambda record: record["level"].name == "INFO") logger.add("warning.log", level="WARNING", rotation="10 MB", filter=lambda record: record["level"].name == "WARNING") logger.add("error.log", level="ERROR", rotation="10 MB", filter=lambda record: record["level"].name == "ERROR") logger.add("critical.log", level="CRITICAL", rotation="10 MB", filter=lambda record: record["level"].name == "CRITICAL") # 输出不同级别的日志消息 logger.debug("This is a debug message") logger.info("This is an info message") logger.warning("This is a warning message") logger.error("This is an error message") logger.critical("This is a critical message")
- 可以过滤不同类型的日志,输出指定类型日志到指定文件
四、异常追溯(不终止程序运行,即不会raise)
-
方式一:装饰器@logger.catch
-
代码
from loguru import logger @logger.catch def run(): test() def test(): print(3 / 0) if __name__ == "__main__": run()
-
控制台输出
-
-
方式二:logger.exception
-
代码
from loguru import logger def test(): try: print(3 / 0) except ZeroDivisionError as e: logger.exception(e) if __name__ == "__main__": test()
-
控制台输出
-