Files
xian_algorithm_new/app/utils/logger.py
T
2026-06-20 17:07:05 +08:00

97 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
日志工具类
主进程使用 loguruQGIS 子进程回退到标准 logging。
"""
import sys
from pathlib import Path
try:
from loguru import logger as _loguru_logger
_HAS_LOGURU = True
except ImportError:
_HAS_LOGURU = False
import logging as _std_logging
class LoggerManager:
"""日志管理器 - 优先 loguru,回退标准 logging"""
_configured = False
_fallback_loggers = {}
@classmethod
def get_logger(cls, name: str = "algorithm", log_dir: str = "logs"):
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_loguru(cls, name: str, log_dir: str):
"""
配置 loguru 日志处理器
Args:
name: 日志名称
log_dir: 日志目录
"""
# 移除默认的 stderr handler
_loguru_logger.remove()
# 创建日志目录
log_path = Path(log_dir)
log_path.mkdir(parents=True, exist_ok=True)
# 控制台 Handler - 彩色输出
_loguru_logger.add(
sink=sys.stderr,
level="INFO",
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> [<cyan>{thread.name}</cyan>] <level>{level: <5}</level> <blue>{name}</blue> - <level>{message}</level>",
colorize=True
)
# 文件 Handler - 按大小分割,Windows 兼容
log_file = log_path / f"{name}.log"
_loguru_logger.add(
sink=str(log_file),
level="DEBUG",
format="{time:YYYY-MM-DD HH:mm:ss} [{thread.name}] {level: <5} {name} - {message}",
rotation="50 MB", # 按大小轮转,避免Windows文件锁定问题
retention="7 days", # 保留7天
compression="zip", # 压缩旧日志文件
encoding="utf-8",
enqueue=True, # 异步写入,避免文件锁定
delay=True, # 延迟打开文件,减少锁定时间
backtrace=True, # 完整堆栈跟踪
diagnose=True # 详细错误诊断
)
cls._configured = True
# 便捷函数
def get_logger(name: str = "algorithm", log_dir: str = "logs"):
"""
获取日志记录器的便捷函数
Args:
name: 日志名称
log_dir: 日志目录
Returns:
loguru.logger 实例
"""
return LoggerManager.get_logger(name, log_dir)