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}",