05.loguru 库
大约 3 分钟学习笔记Python基础
一. 安装
pip install loguru
二. 封装类
使用 new 封装
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author : Pupper
# @Email : pupper.cheng@gmail.com
import time
import loguru
from common._root_path import root_path
from threading import RLock
class Log:
_instance = None
_lock = RLock()
_initialized = False # 新增一个类属性,用于标记是否已经初始化
def __new__(cls, *args, **kwargs):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super(Log, cls).__new__(cls)
return cls._instance
def __init__(self):
if not self._initialized: # 只有当_initialized为False时,才执行初始化操作
lists: list = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).split(' ')
print(f"日志初始化成功, 时间: {lists[0]} {lists[1]}")
loguru.logger.add(
sink=f"{root_path}/logs/{lists[0]}/{lists[1]}.log", # 日志路径
level='INFO', # 日志等级
encoding='utf-8', # 编码格式
rotation='00:00', # 日志创建周期,每日 00:00 创建
retention='1 week', # 日志保留时长
compression='zip', # 压缩格式
enqueue=True, # 非阻塞
backtrace=True, # 堆栈跟踪
diagnose=True # 诊断信息
)
self._initialized = True
@staticmethod
def info(message: str):
loguru.logger.info(message)
@staticmethod
def debug(message: str):
loguru.logger.debug(message)
@staticmethod
def warning(message: str):
loguru.logger.warning(message)
@staticmethod
def error(message: str):
loguru.logger.error(message)
logger = Log()
使用装饰器封装
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author : Pupper
# @Email : pupper.cheng@gmail.com
import time
from functools import wraps
from utils.root_path import get_project_path
import loguru
from threading import RLock
single_lock = RLock()
def Singleton(cls):
instance = {}
def _singleton_wrapper(*args, **kargs):
with single_lock:
if cls not in instance:
instance[cls] = cls(*args, **kargs)
return instance[cls]
return _singleton_wrapper
@Singleton
class Log:
def __init__(self):
self.logger_add()
@staticmethod
def get_log_path() -> str:
root_path = get_project_path()
creat_time = time.strftime("%Y-%m-%d", time.localtime())
logs_file_path = root_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
log_filename = '{}.log'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 日志文件名
log_path = logs_path.joinpath(logs_path, log_filename) # 日志文件路径
return 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
log = Log().get_logger
三. 简单使用
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
四. 保留日志文件
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
五. 字符串输出
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]!