Loguru:Python日志管理模块的更优雅、简洁拓展
【拓展】Loguru:更为优雅、简洁的Python 日志管理模块
【一】引入
【二】安装
pip3 install loguru
【三】基本使用
【1】使用方法
【2】示例
from loguru import logger
logger.debug('This is debug information')
logger.info('This is info information')
logger.warning('This is warn information')
logger.error('This is error information')
【3】样式

【4】不同日志级别与日志记录方法对应关系
| 级别名称 | 严重度值 | 记录器法 |
|---|---|---|
| TRACE | 5 | logger.trace() |
| DEBUG | 10 | logger.debug() |
| INFO | 20 | logger.info() |
| SUCCESS | 25 | logger.success() |
| WARNING | 30 | logger.warning() |
| ERROR | 40 | logger.error() |
| CRITICAL | 50 | logger.critical() |
logger.trace('这是一条记录日志)
logger.debug('这是一条测试日志')
logger.info('这是一条信息日志')
logger.success('这是一条成功日志')
logger.warning('这是一条警告日志')
logger.error('这是一条错误日志')
logger.critical('这是一条严重错误日志')
【5】日志规则
from loguru import logger
logger.add("file.log", format="{time} {level} {message}", level="INFO")
logger.debug("这是一条测试日志")
logger.info("这是一条信息日志")
2023-08-07 23:16:25.307 | DEBUG | __main__:<module>:18 - 这是一条测试日志
2023-08-07 23:16:25.307 | INFO | __main__:<module>:19 - 这是一条信息日志
【6】保存到文件
from loguru import logger
logger.add("file.log")
logger.debug("这是一条debug日志")
logger.info("这是一条info日志")
【7】日志文件拆分(add方法)
from loguru import logger
logger.add("log_{time}.log", encoding='utf-8') # 以时间命名
【四】loguru 配置日志文件
from loguru import logger
logger.add("E:/Old Boy/day_projects/日志模块/log_2023-8-7.log",rotation="500MB", encoding="utf-8", enqueue=True, retention="10 days")
logger.info('This is info information')
2023-08-07 22:47:11.611 | INFO | __main__:<module>:19 - This is info information
【五】日志内容的字符串格式化
import platform
from loguru import logger
rounded_value = round(0.345, 2)
trace= logger.add('2023-8-7.log')
logger.info('If you are using Python {version}, prefer {feature} of course!', version=platform.python_version(), feature='f-strings')
2023-08-07 22:46:03.812 | INFO | __main__:<module>:21 - If you are using Python 3.9.13, prefer f-strings of course!
【六】loguru日志常用参数配置解析
如果当接收器(sink)是文件路径( pathlib.Path )时,可以应用下列参数,同时add() 会返回与所添加的接收器相关联的标识符:
【七】loguru 日志常用方式
【1】停止日志记录到文件中
from loguru import logger
trace = logger.add('2021-8-7.log')
logger.error('This is error information')
logger.remove(trace)
logger.warning('This is warn information')
2023-08-07 22:50:37.834 | ERROR | __main__:<module>:17 - This is error information
2023-08-07 22:50:37.834 | WARNING | __main__:<module>:20 - This is warn information
2023-8-7.log内容如下2023-08-07 22:50:37.834 | ERROR | __main__:<module>:17 - This is error information
from loguru import logger
# 清除之前的设置
logger.remove(handler_id=None)
trace = logger.add('2023-8-7.log')
logger.error('This is error information')
logger.warning('This is warn information')
【2】filter 配置日志过滤规则
from loguru import logger
def error_only(record):
"""
error 日志 判断
Args:
record:
Returns: 若日志级别为ERROR, 输出TRUE
"""
return record["level"].name == "ERROR"
# ERROR以外级别日志被过滤掉
logger.add("2023-8-7.log", filter=error_only)
logger.error('This is error information')
logger.warning('This is warn information')
2023-08-07 22:53:14.679 | ERROR | __main__:<module>:32 - This is error information
2023-08-07 22:53:14.680 | WARNING | __main__:<module>:33 - This is warn information
2023-8-7.log 日志中,我们可以看到仅记录了ERROR级别日志。2023-08-07 22:53:14.679 | ERROR | __main__:<module>:32 - This is error information
【3】format 配置日志记录格式化模板
from loguru import logger
def format_log():
"""
Returns:
"""
trace = logger.add('2023-8-7.log',
format="{time:YYYY-MM-DD HH:mm:ss} {level} From {module}.{function} : {message}")
logger.warning('This is warn information')
if __name__ == '__main__':
format_log()
2023-08-07 22:54:11.901 | WARNING | __main__:format_log:26 - This is warn information
2023-8-7.log 日志文件中,如 "{time:YYYY-MM-DD HH:mm:ss} {level} From {module}.{function} : {message}" 格式模板进行记录:2023-08-07 22:54:11 WARNING From 01 日志模块测试.format_log : This is warn information
【4】enqueue 异步写入
logger.add("2023-8-7.log", enqueue=True)
【5】其它的格式化模板属性 如下:
| Key | Description |
|---|---|
| elapsed | 从程序开始经过的时间差 |
| exception | 格式化异常(如果有),否则为' None ' |
| extra | 用户绑定的属性字典(参见bind()) |
| file | 进行日志记录调用的文件 |
| function | 进行日志记录调用的函数 |
| level | 用于记录消息的严重程度 |
| line | 源代码中的行号 |
| message | 记录的消息(尚未格式化) |
| module | 进行日志记录调用的模块 |
| name | 进行日志记录调用的__name__ |
| process | 进行日志记录调用的进程名 |
| thread | 进行日志记录调用的线程名 |
| time | 发出日志调用时的可感知的本地时间 |
(1)通过 extra bind() 添加额外属性来为结构化日志提供更多属性信息
from loguru import logger
def format_log():
"""
Returns:
"""
trace = logger.add('2023-8-7.log',
format="{time:YYYY-MM-DD HH:mm:ss} {extra[ip]} {extra[username]} {level} From {module}.{function} : {message}")
extra_logger = logger.bind(ip="192.168.0.1", username="张三")
extra_logger.info('This is info information')
extra_logger.bind(username="李四").error("This is error information")
extra_logger.warning('This is warn information')
if __name__ == '__main__':
format_log()
2023-08-07 22:56:16.435 | INFO | __main__:format_log:27 - This is info information
2023-08-07 22:56:16.435 | ERROR | __main__:format_log:28 - This is error information
2023-08-07 22:56:16.436 | WARNING | __main__:format_log:30 - This is warn information
2023-08-07 22:56:16 192.168.0.1 张三 INFO From 01 日志模块测试.format_log : This is info information
2023-08-07 22:56:16 192.168.0.1 李四 ERROR From 01 日志模块测试.format_log : This is error information
2023-08-07 22:56:16 192.168.0.1 张三 WARNING From 01 日志模块测试.format_log : This is warn information
(2)level 配置日志最低日志级别
from loguru import logger
trace = logger.add('2023-8-7.log', level='ERROR')
(3)rotation 配置日志滚动记录的机制
from loguru import logger
trace = logger.add('2023-8-7.log', rotation="200 MB")
from loguru import logger
trace = logger.add('2023-8-7.log', rotation='06:00')
from loguru import logger
trace = logger.add('2023-8-7.log', rotation='2 week')
from loguru import logger
logger.add("2023-8-7.log", retention="10 days")
(4)retention 配置日志保留机制
from loguru import logger
trace = logger.add('2023-8-7.log', retention='7 days')
(5)compression 配置日志压缩格式
from loguru import logger
trace = logger.add('2023-8-7.log', compression='zip')
(6)serialize 日志序列化
from loguru import logger
import platform
rounded_value = round(0.345, 2)
trace= logger.add('2023-8-7.log', serialize=True)
logger.info('If you are using Python {version}, prefer {feature} of course!', version=platform.python_version(), feature = 'f-strings')
2023-08-07 23:01:14.356 | INFO | __main__:<module>:21 - If you are using Python 3.9.13, prefer f-strings of course!
{
"text": "2023-08-07 23:01:14.356 | INFO | __main__:<module>:21 - If you are using Python 3.9.13, prefer f-strings of course!\n",
"record": {
"elapsed": {
"repr": "0:00:00.018001",
"seconds": 0.018001
},
"exception": null,
"extra": {
"version": "3.9.13",
"feature": "f-strings"
},
"file": {
"name": "01 日志模块测试.py",
"path": "E:\\day_projects\\日志模块\\01 日志模块测试.py"
},
"function": "<module>",
"level": {
"icon": "\u2139\ufe0f",
"name": "INFO",
"no": 20
},
"line": 9,
"message": "If you are using Python 3.9.13, prefer f-strings of course!",
"module": "01 日志模块测试",
"name": "__main__",
"process": {
"id": 21636,
"name": "MainProcess"
},
"thread": {
"id": 28612,
"name": "MainThread"
},
"time": {
"repr": "2023-08-07 23:01:14.356111+08:00",
"timestamp": 1691420474.356111
}
}
}
(7)Traceback 记录(异常追溯)
from loguru import logger
trace = logger.add('2023-8-7.log')
@logger.catch
def index_error(custom_list: list):
for index in range(len(custom_list)):
index_value = custom_list[index]
if custom_list[index] < 2:
custom_list.remove(index_value)
print(index_value)
if __name__ == '__main__':
index_error([1, 2, 3])

2023-08-07 23:08:12.010 | ERROR | __main__:<module>:30 - An error has been caught in function '<module>', process 'MainProcess' (17440), thread 'MainThread' (26612):
Traceback (most recent call last):
> File "E:\Old Boy\day_projects\日志模块\01 日志模块测试.py", line 30, in <module>
index_error([1, 2, 3])
└ <function index_error at 0x000001DFBB471550>
File "E:\Old Boy\day_projects\日志模块\01 日志模块测试.py", line 22, in index_error
index_value = custom_list[index]
│ └ 2
└ [2, 3]
IndexError: list index out of range
from loguru import logger
trace = logger.add('2023-8-7.log')
class Demo:
@logger.catch
def index_error(self, custom_list: list):
for index in range(len(custom_list)):
index_value = custom_list[index]
if custom_list[index] < 2:
custom_list.remove(index_value)
@staticmethod
@logger.catch
def index_error_static(custom_list: list):
for index in range(len(custom_list)):
index_value = custom_list[index]
if custom_list[index] < 2:
custom_list.remove(index_value)
if __name__ == '__main__':
# Demo().index_error([1, 2, 3])
Demo.index_error_static([1, 2, 3])
(8)通过 logger.exception 方法也可以实现异常的捕获与记录:
from loguru import logger
trace = logger.add('2023-8-7.log')
def index_error(custom_list: list):
for index in range(len(custom_list)):
try:
index_value = custom_list[index]
except IndexError as err:
logger.exception(err)
break
if custom_list[index] < 2:
custom_list.remove(index_value)
if __name__ == '__main__':
index_error([1, 2, 3])
2023-08-07 23:11:16.587 | ERROR | __main__:index_error:24 - list index out of range
Traceback (most recent call last):
File "E:\Old Boy\day_projects\日志模块\01 日志模块测试.py", line 32, in <module>
index_error([1, 2, 3])
└ <function index_error at 0x000002B1327E01F0>
> File "E:\Old Boy\day_projects\日志模块\01 日志模块测试.py", line 22, in index_error
index_value = custom_list[index]
│ └ 2
└ [2, 3]
IndexError: list index out of range
