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]], console_log_level: str = "INFO", ) -> 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=console_log_level, colorize=True, format="{time:HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}", ) 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"控制台日志级别: {console_log_level}")