loguru模块是python日志记录和输出的第三方库,相比python自带的logging需要自定义日志的格式,输出文件等。loguru使用则更加方便,简洁。
安装
pip install loguru
使用
1.输出日志到控制台
这里日志的输出自带默认的时间格式
from loguru import logger
logger.info("this is info log")
2.日志输出到文件
from loguru import logger
logger.add("file.log")
logger.info("this is info log")
3.日志rotation / retention / compression
logger.add("file_1.log", rotation="500 MB") # 文件超过500MB则新生成一个文件
logger.add("file_2.log", rotation="00:00") # 每天0点新生成一个文件
logger.add("file_X.log", retention="10 days") # 保留10天的日志文件
logger.add("file_Y.log", compression="zip") # 如果不想删除原有日志文件,loguru可以将日志直接压缩
日志模块封装
这里直接给一个将loguru封装后的工具,可以放在项目公共部分的utils目录下,提供其他模块调用
import os
import sys
import loguru
class Logger:
"""more config params
level="ERROR",
format="{time:HH:mm:ss} {message}",
retention='10 days', # 设置历史保留时长 分时间'10 days' 分文件个数
rotation="5kb", # 切割,设置文件大小,rotation="12:00",rotation="1 week"
filter="my_module" # 过滤模块
compression="zip", # 文件压缩
serialize = True
backtrace=True, # 回溯
diagnose=True, # 诊断
enqueue=True, # 异步写入
"""
__instance = None
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls.__instance
def __init__(self, name=None):
if not os.path.isdir(self.log_path):
os.makedirs(self.log_path)
if name is None:
self.name = __name__
self.logger_add()
base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
log_path = os.path.join(base_path, 'logs')
info_file = os.path.join(log_path, 'info.log')
warning_file = os.path.join(log_path, 'warning.log')
error_file = os.path.join(log_path, 'error.log')
critical_file = os.path.join(log_path, 'critical.log')
def logger_add(self):
config = {
"handlers": [
{
"sink": sys.stdout,
'level': 'DEBUG',
"format": "<green>[{time:YYYY-MM-DD HH:mm:ss}]</green>|{extra[name]}|{level}|{file}:{module}:{line}:<level>{message}</level>",
},
{
"sink": self.info_file,
'level': 'INFO',
'filter': lambda x: 'INFO' in str(x['level']).upper(),
'retention': 5,
'rotation': '1 hours',
"format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}"},
{
"sink": self.warning_file,
'level': 'WARNING',
'filter': lambda x: 'WARNING' in str(x['level']).upper(),
'retention': 5,
'rotation': '1kb',
"format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
},
{
"sink": self.error_file,
'level': 'ERROR',
'filter': lambda x: 'ERROR' in str(x['level']).upper(),
'retention': 5,
'rotation': '1kb',
"format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
},
{
"sink": self.critical_file,
'level': 'CRITICAL',
'filter': lambda x: 'CRITICAL' in str(x['level']).upper(),
'retention': 5,
'rotation': '1kb',
"format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
},
],
"extra": {"name": self.name}
}
loguru.logger.configure(**config)
@property
def get_logger(self):
return loguru.logger
logger = Logger().get_logger