二十二、loguru 库

一. 安装

1
pip install loguru

二. 封装类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import time
from functools import wraps
from pathlib import Path
import loguru


# 单例类的装饰器
def singleton_class_decorator(cls):
"""
装饰器,单例类的装饰器
"""
# 在装饰器里定义一个字典,用来存放类的实例。
_instance = {}

# 装饰器,被装饰的类
@wraps(cls)
def wrapper_class(*args, **kwargs):
# 判断,类实例不在类实例的字典里,就重新创建类实例
if cls not in _instance:
# 将新创建的类实例,存入到实例字典中
_instance[cls] = cls(*args, **kwargs)
# 如果实例字典中,存在类实例,直接取出返回类实例
return _instance[cls]

# 返回,装饰器中,被装饰的类函数
return wrapper_class


@singleton_class_decorator
class Logger:
def __init__(self):
self.logger_add()

def get_project_path(self, project_path=None):
if project_path is None:
# 当前项目文件的,绝对真实路径
# 路径,一个点代表当前目录,两个点代表当前目录的上级目录
project_path = Path.cwd().parent
# 返回当前项目路径
return project_path

def get_log_path(self):
# 项目目录
project_path = self.get_project_path()
# 项目日志目录
creat_time = time.strftime("%Y-%m-%d", time.localtime())
logs_file_path = Path(project_path).joinpath('logs', creat_time)
if logs_file_path.exists():
logs_path = logs_file_path
else:
try:
logs_file_path.mkdir(parents=True)
except Exception as e:
print(f"创建文件报错: {e}")
logs_path = logs_file_path
# 日志文件名
project_log_filename = '{}.log'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) )
# 日志文件路径
project_log_path = Path(logs_path).joinpath(logs_path, project_log_filename)
# 返回日志路径
return project_log_path

def logger_add(self):
loguru.logger.add(
# 水槽,分流器,可以用来输入路径
sink=self.get_log_path(),
# 日志创建周期
rotation='00:00',
# 保存
retention='1 day',
# 文件的压缩格式
compression='zip',
# 编码格式
encoding="utf-8",
# 具有使日志记录调用非阻塞的优点
enqueue=True
)

@property
def get_logger(self):
return loguru.logger

三. 简单使用

1
2
3
4
5
6
7
8
9
10
11
12
from loguru import logger

logger.info("中文 loguru")
logger.debug("中文 loguru")
logger.error("中文 loguru")
logger.warning("中文 loguru")

# 运行结果
2024-01-10 13:41:42.920 | INFO | __main__:<module>:7 - 中文 loguru
2024-01-10 13:41:42.920 | DEBUG | __main__:<module>:8 - 中文 loguru
2024-01-10 13:41:42.920 | ERROR | __main__:<module>:9 - 中文 loguru
2024-01-10 13:41:42.920 | WARNING | __main__:<module>:10 - 中文 loguru

四. 保留日志文件

1
2
3
4
5
6
7
from loguru import logger

logger.add("interface_log_{time}.log", rotation="500MB", encoding="utf-8", enqueue=True, compression="zip", retention="10 days")
logger.info("中文test")
logger.debug("中文test")
logger.error("中文test")
logger.warning("中文test")
  • 当需要输出中文日志时, 需要加上 encoding="utf-8", 避免出现乱码
  • enqueue=True: 异步写入, 在多进程同时写日志时, 使用队列达到异步功效
  • rotation: 创建日志文件的条件
    • rotation="500MB: 当日志文件达到 500MB 时会重新创建一个日志文件
    • rotation="12:00": 每天 12 点创建新的文件
    • rotation="1week": 每隔一周创建一个新的日志文件
  • retention: 日志最长保留时间, 如 "1 week"、"3 days"、"2 months"
  • compression: 日志文件的压缩格式, 常见格式: zip、tar、gz、tar.gz

五. 字符串输出

1
2
3
4
5
6
7
8
logger.info('如果你使用的是 Python{}, 当然更喜欢 {feature}!', 3.6, feature='f-strings')
n1 = "cool"
n2 = [1, 2, 3]
logger.info(f'如果你使用的是 Python {n1}, 当然更喜欢 {n2}!')

# 输出结果
2024-01-10 14:16:50.941 | INFO | __main__:<module>:7 - 如果你使用的是 Python3.6, 当然更喜欢 f-strings!
2024-01-10 14:16:50.941 | INFO | __main__:<module>:10 - 如果你使用的是 Python cool, 当然更喜欢 [1, 2, 3]!