From 402102cf364f5a1027cccbf2ee49f451e440b0cf Mon Sep 17 00:00:00 2001 From: wzy-warehouse <18135009705@163.com> Date: Sat, 20 Jun 2026 17:07:05 +0800 Subject: [PATCH] =?UTF-8?q?QGIS=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/paths.py | 16 +++------------ app/utils/logger.py | 50 +++++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/app/config/paths.py b/app/config/paths.py index b8868ff..185b174 100644 --- a/app/config/paths.py +++ b/app/config/paths.py @@ -18,16 +18,6 @@ DBN_CONFIG_DIR = CONFIG_DIR / "dbn" def get_logger(name: str = "algorithm"): - """ - 获取日志记录器。主进程用 loguru,QGIS 子进程回退到标准 logging。 - """ - try: - from app.utils.logger import get_logger as _get_logger - return _get_logger(name, str(LOG_DIR)) - except ImportError: - import logging - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s [%(threadName)s] %(levelname)-5s %(name)s - %(message)s", - ) - return logging.getLogger(name) + """获取日志记录器(loguru 不可用时自动回退标准 logging)""" + from app.utils.logger import LoggerManager + return LoggerManager.get_logger(name, str(LOG_DIR)) diff --git a/app/utils/logger.py b/app/utils/logger.py index aad19b8..4b0319b 100644 --- a/app/utils/logger.py +++ b/app/utils/logger.py @@ -1,35 +1,45 @@ """ 日志工具类 -使用 loguru 提供增强的日志功能,支持按天分割、自动清理过期日志 +主进程使用 loguru,QGIS 子进程回退到标准 logging。 """ import sys from pathlib import Path -from loguru import logger + +try: + from loguru import logger as _loguru_logger + _HAS_LOGURU = True +except ImportError: + _HAS_LOGURU = False + import logging as _std_logging class LoggerManager: - """日志管理器 - 基于 loguru""" + """日志管理器 - 优先 loguru,回退标准 logging""" _configured = False + _fallback_loggers = {} @classmethod def get_logger(cls, name: str = "algorithm", log_dir: str = "logs"): - """ - 获取日志记录器(loguru 不需要传统意义上的 logger 实例) - - Args: - name: 日志名称(用于文件命名) - log_dir: 日志目录 - - Returns: - loguru.logger 实例 - """ - if not cls._configured: - cls._configure_logger(name, log_dir) - return logger + if _HAS_LOGURU: + if not cls._configured: + cls._configure_loguru(name, log_dir) + return _loguru_logger + else: + if name not in cls._fallback_loggers: + logger = _std_logging.getLogger(name) + logger.setLevel(_std_logging.INFO) + if not logger.handlers: + h = _std_logging.StreamHandler(sys.stderr) + h.setFormatter(_std_logging.Formatter( + "%(asctime)s [%(threadName)s] %(levelname)-5s %(name)s - %(message)s" + )) + logger.addHandler(h) + cls._fallback_loggers[name] = logger + return cls._fallback_loggers[name] @classmethod - def _configure_logger(cls, name: str, log_dir: str): + def _configure_loguru(cls, name: str, log_dir: str): """ 配置 loguru 日志处理器 @@ -38,14 +48,14 @@ class LoggerManager: log_dir: 日志目录 """ # 移除默认的 stderr handler - logger.remove() + _loguru_logger.remove() # 创建日志目录 log_path = Path(log_dir) log_path.mkdir(parents=True, exist_ok=True) # 控制台 Handler - 彩色输出 - logger.add( + _loguru_logger.add( sink=sys.stderr, level="INFO", format="{time:YYYY-MM-DD HH:mm:ss} [{thread.name}] {level: <5} {name} - {message}", @@ -54,7 +64,7 @@ class LoggerManager: # 文件 Handler - 按大小分割,Windows 兼容 log_file = log_path / f"{name}.log" - logger.add( + _loguru_logger.add( sink=str(log_file), level="DEBUG", format="{time:YYYY-MM-DD HH:mm:ss} [{thread.name}] {level: <5} {name} - {message}",