feat: 引入 Loguru

This commit is contained in:
2026-09-29 00:47:57 +08:00
parent 0fdde8c3e6
commit 437fcd74b1
8 changed files with 139 additions and 31 deletions
+12 -16
View File
@@ -1,10 +1,10 @@
import inspect
import logging
import time
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, TypeVar
from langgraph.errors import GraphInterrupt
from loguru import logger
from pydantic import ValidationError
if TYPE_CHECKING:
@@ -20,7 +20,7 @@ class BaseNode(ABC):
def __init__(self, config: "Settings | None" = None):
"""保存显式配置;全局配置在节点实际使用时才加载。"""
self._config = config
self.logger = logging.getLogger(f"import.{self.name}")
self.logger = logger.bind(node=self.name)
@property
def config(self) -> "Settings":
@@ -35,24 +35,22 @@ class BaseNode(ABC):
if inspect.iscoroutinefunction(self.process):
return self._acall(state)
start_time = time.perf_counter()
self.logger.info("--- %s 开始 ---", self.name)
self.logger.info("节点开始")
try:
result = self.process(state)
except GraphInterrupt:
raise
except (AppError, ValidationError):
self.logger.exception("%s 执行失败", self.name)
self.logger.error("节点执行失败")
raise
except Exception as e:
self.logger.exception("%s 执行失败", self.name)
self.logger.error("节点执行失败")
raise ImportProcessError(str(e), node_name=self.name) from e
else:
self.logger.info("--- %s 完成 ---", self.name)
self.logger.info("节点完成")
return result
finally:
self.logger.info(
"%s 耗时 %.3f 秒", self.name, time.perf_counter() - start_time
)
self.logger.info(f"节点耗时 {time.perf_counter() - start_time:.3f} 秒")
@abstractmethod
def process(self, state: T) -> T:
@@ -61,24 +59,22 @@ class BaseNode(ABC):
async def _acall(self, state: T) -> T:
"""异步节点等待执行完成后再记录结果和耗时"""
start_time = time.perf_counter()
self.logger.info("--- %s 开始 ---", self.name)
self.logger.info("节点开始")
try:
result = await self.process(state)
except GraphInterrupt:
raise
except (AppError, ValidationError):
self.logger.exception("%s 执行失败", self.name)
self.logger.error("节点执行失败")
raise
except Exception as error:
self.logger.exception("%s 执行失败", self.name)
self.logger.error("节点执行失败")
raise ImportProcessError(str(error), node_name=self.name) from error
else:
self.logger.info("--- %s 完成 ---", self.name)
self.logger.info("节点完成")
return result
finally:
self.logger.info(
"%s 耗时 %.3f 秒", self.name, time.perf_counter() - start_time
)
self.logger.info(f"节点耗时 {time.perf_counter() - start_time:.3f} 秒")
def log_step(self, step_name: str, message: str = ""):
"""记录步骤日志。"""