logger.py
import atexit as _atexit
import sys as _sys
from loguru._logger import _defaults, Core as _Core, Logger as _Logger
"""
sink: 可以传入一个 file 对象,例如 sys.stderr 或者 open('file.log', 'w')。
sink: 可以直接传入一个 str 字符串或者 pathlib.Path 对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志输出进去。
sink: 可以是一个方法,可以自行定义输出实现。
sink: 可以是一个 logging 模块的 Handler,比如 FileHandler、StreamHandler 等等,这样就可以实现自定义 Handler 的配置。
sink: 还可以是一个自定义的类,具体的实现规范可以参见官方文档: https://loguru.readthedocs.io/en/stable/api/logger.html。
rotation:分隔日志文件,何时关闭当前日志文件并启动一个新文件的条件;
例如,"500 MB"、"0.5 GB"、"1 month 2 weeks"、"10h"、"monthly"、"18:00"、"sunday"、"monday at 18:00"、"06:15"
retention (str, int, datetime.timedelta or callable, optional) ,可配置旧日志的最长保留时间,例如,"1 week, 3 days"、"2 months"
compression (str or callable, optional):
日志文件在关闭时应转换为的压缩或归档格式,例如,"gz"、"bz2"、"xz"、"lzma"、"tar"、"tar.gz"、"tar.bz2"、"tar.xz"、"zip"
delay (bool, optional):是否应该在配置了接收器之后立即创建文件,或者延迟到第一个记录的消息。默认为' False '。
mode (str, optional) :与内置open()函数一样的打开模式。默认为' "a"(以附加模式打开文件)。
buffering (int, optional) :内置open()函数的缓冲策略,它默认为1(行缓冲文件)。
encoding (str, optional) :文件编码与内置的' open() '函数相同。如果' None ',它默认为'locale.getpreferredencoding() 。
"""
class Logger:
def __init__(self, prefix, logfile_path, level="INFO"):
self.logfile_path = logfile_path
self.prefix = prefix
self.level = level
self.logger = self.setup_logger()
def filter_log(self, record):
record["message"] = f"[{self.prefix}]-" + record["message"]
return True
def setup_logger(self):
logger = _Logger(
core=_Core(),
exception=None,
depth=0,
record=False,
lazy=False,
colors=False,
raw=False,
capture=True,
patcher=None,
extra={},
)
if _defaults.LOGURU_AUTOINIT and _sys.stderr:
logger.add(_sys.stderr)
logger.add(
# 日志文件路径
sink=self.logfile_path,
# 日志等级
level=self.level,
# 日志格式
format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<level>{level: <8}</level> | "
"<level>{message}</level>",
# 过滤
filter=self.filter_log,
# 日志创建周期
rotation="00:00",
# 保存
retention="3 months",
# 文件的压缩格式
compression="tar.gz",
# 编码格式
encoding="utf-8",
# 具有使日志记录调用非阻塞的优点
enqueue=True,
)
_atexit.register(logger.remove)
return logger
init.py
"""
实例化日志类
"""
from logger import Logger
base_dir = "/"
one_log_path = base_dir + '/logs/one_{time:%Y-%m-%d}.log'
two_log_path = base_dir + '/logs/two_{time:%Y-%m-%d}.log'
one_logger = Logger('One', one_log_path , level="info").logger
two_logger = Logger('Two', two_log_path, level="WARNING").logger
work.py
from . import one_logger
one_logger.info("xxxxxxx")
one_logger.warning("xxxxxxx")
one_logger.error("xxxxxxx")