80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
import sys
|
||
from pathlib import Path
|
||
from typing import TYPE_CHECKING, List, Type
|
||
|
||
from loguru import logger
|
||
|
||
if TYPE_CHECKING:
|
||
from loguru import Record
|
||
|
||
|
||
def file_exception_filter(
|
||
record: "Record",
|
||
ignored_exceptions: tuple[Type[Exception], ...]
|
||
) -> bool:
|
||
"""
|
||
一个自定义的 Loguru 过滤器函数。
|
||
如果日志记录包含异常信息,并且该异常的类型在 ignored_exceptions 中,则返回 False(忽略)。
|
||
否则,返回 True(允许记录)。
|
||
"""
|
||
exception_info = record.get("exception")
|
||
|
||
if exception_info:
|
||
exception_type = exception_info[0]
|
||
|
||
if exception_type and issubclass(exception_type, ignored_exceptions):
|
||
return False
|
||
|
||
return True
|
||
|
||
|
||
def init_logger(
|
||
log_dir: Path,
|
||
ignored_exceptions: List[Type[Exception]]
|
||
) -> None:
|
||
"""
|
||
配置全局 Loguru Logger。
|
||
|
||
Args:
|
||
log_dir (Path): 存放日志文件的文件夹路径,会自动创建。
|
||
ignored_exceptions (List[Type[Exception]]): 在 WARNING 级别文件日志中需要忽略的异常类型列表。
|
||
"""
|
||
|
||
ignored_exceptions_tuple = tuple(ignored_exceptions)
|
||
logger.remove()
|
||
|
||
log_dir.mkdir(parents=True, exist_ok=True)
|
||
|
||
logger.add(
|
||
sys.stderr,
|
||
level="INFO",
|
||
colorize=True,
|
||
format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
|
||
)
|
||
|
||
info_log_path = log_dir / "log.log"
|
||
logger.add(
|
||
str(info_log_path),
|
||
level="INFO",
|
||
rotation="10 MB",
|
||
retention="7 days",
|
||
enqueue=True,
|
||
backtrace=False,
|
||
diagnose=False,
|
||
)
|
||
|
||
warning_error_log_path = log_dir / "error.log"
|
||
logger.add(
|
||
str(warning_error_log_path),
|
||
level="WARNING",
|
||
rotation="10 MB",
|
||
compression="zip",
|
||
enqueue=True,
|
||
filter=lambda record: file_exception_filter(record, ignored_exceptions_tuple),
|
||
backtrace=True,
|
||
diagnose=True,
|
||
)
|
||
|
||
logger.info("Loguru Logger 初始化完成!")
|
||
logger.info(f"控制台日志级别: INFO")
|