python利用loguru模块实现简易的通用代码日志系统(utils)

实现主要通用功能:
python日志同时输出到控制台(屏幕)和文件。(日志添加多个handler)
日志按功能划分为不同文件。

此处再提及一些新入坑loguru遇到的一些小问题,在代码中都有实现。
loguru如何格式化控制台输出日志(loguru修改了format后格式只在文件中生效,未在控制台生效)
loguru如何既输出到控制台(屏幕)又输出到文件。
loguru如何每隔多少大小分成新的log文件。
loguru如何实现日志文件按个数保存(到达某一日志文件数量后自动清理)
loguru如何实现日志文件按照天数保存,超过指定天数自动清理。
loguru如何实现日志文件压缩存储,分隔文件后旧文件自动压缩,节省磁盘空间。

python常用的日志实现模块通常是logging,但是后来发现配置起来较为复杂,又发现了一个更简易,实现起来更方便,显示效果更好的日志记录模块loguru,能够满足日常开发的一般需求,因此使用该模块实现了一个建议的日志记录框架。

代码实现demo
日志核心文件
logcore.py

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
import sys
import loguru
import copy

logger = loguru.logger
logger.remove()
logger1 = copy.deepcopy(logger)
logger2 = copy.deepcopy(logger)


class LogCore(object):
"""
使用指定format格式输出到控制台
"""
def __init__(self):
self.logger = logger # logger日志1

self.log_level = "DEBUG" # [DEBUG|INFO|WARNING|ERROR|SUCCESS|CRITICAL]

self.log_format = '{time} <red>{level}</red> {message}'

def log_conf(self):
self.logger.add(format=self.log_format, sink=sys.stderr, level=self.log_level)
return self.logger


class LogCore2(object):
"""
使用默认输出格式输出到控制台
使用指定输出格式输出到文件
"""
def __init__(self):
self.logger = logger2 # logger日志2

self.LOG_PATH = "./templogs/"
self.log_name = "test2.log"
self.log_file_size = "50 MB"
self.log_retention = 20
self.log_level = "DEBUG" # [DEBUG|INFO|WARNING|ERROR|SUCCESS|CRITICAL]

self.log_format = '{time} <red>{level}</red> {message}' # 输出到文件指定的格式

def log_conf(self):
self.logger.add(
format=self.log_format,
sink=self.LOG_PATH+self.log_name, # 日志文件
rotation=self.log_file_size, # 每多少大小分成新文件
retention=self.log_retention, # 日志保留时间或个数
# compression='zip', # 是否对日志进行压缩存储
level=self.log_level # 日志文件记录的最低日志等级
) # 使用指定format,写入到文件
self.logger.add(sys.stderr) # 使用默认format,输出到控制台
return self.logger


_logcore = LogCore()
_logcore2 = LogCore2()

logcore = _logcore.log_conf()
logcore2 = _logcore2.log_conf()

调用日志的测试文件
test.py

1
2
3
4
5
6
7
8
from logcore import logcore, logcore2
def main():
logcore.error(11111)
logcore2.error(22222)


if __name__ == '__main__':
main()