压制了无用日志
This commit is contained in:
@@ -131,7 +131,7 @@ class ApiClient:
|
||||
f"total={stats['total']}, success={stats['success']}, failure={stats['failure']}"
|
||||
)
|
||||
|
||||
def log_request_stats(self, level: str = "INFO") -> None:
|
||||
def log_request_stats(self, level: str = "DEBUG") -> None:
|
||||
"""输出当前客户端生命周期内的请求统计。"""
|
||||
self._log(self.format_request_stats(), level=level)
|
||||
|
||||
@@ -140,7 +140,7 @@ class ApiClient:
|
||||
return
|
||||
self._log(
|
||||
f"🔎 ApiClient request: method={method.upper()} endpoint={endpoint} elapsed={elapsed_seconds:.3f}s",
|
||||
level="INFO",
|
||||
level="DEBUG",
|
||||
)
|
||||
|
||||
def _log(self, message: str, level: str = "DEBUG"):
|
||||
|
||||
@@ -349,10 +349,10 @@ class BaseApiHandler(BaseNodeHandler[T]):
|
||||
|
||||
if diff_fields:
|
||||
node_info = f"[{node_id}]" if node_id else ""
|
||||
logger.info(" [DIFF] %s%s schema=%s", self.node_type, node_info, schema.__name__)
|
||||
logger.debug(" [DIFF] %s%s schema=%s", self.node_type, node_info, schema.__name__)
|
||||
for k, v in diff_fields.items():
|
||||
orig_v = origin_dict.get(k)
|
||||
logger.info(" • %s: %r → %r", k, orig_v, v)
|
||||
logger.debug(" • %s: %r → %r", k, orig_v, v)
|
||||
|
||||
return diff_fields if diff_fields else None
|
||||
|
||||
|
||||
@@ -75,6 +75,8 @@ class BaseDataSource(ABC):
|
||||
def __init__(self, poll_max_retries: int = 1, poll_interval: float = 0.5):
|
||||
self._handlers: Dict[str, "NodeHandler"] = {}
|
||||
self._collection: Optional["DataCollection"] = None
|
||||
self._endpoint_name: str = "unknown"
|
||||
self._datasource_type: str = self.__class__.__name__.lower()
|
||||
|
||||
# 按节点类型统计信息
|
||||
# {"company": {"loaded": 10, "synced": 10, "success": 10, "failed": 0}, ...}
|
||||
@@ -87,6 +89,17 @@ class BaseDataSource(ABC):
|
||||
self._poll_interval = max(0, poll_interval)
|
||||
self._sm_runtime: Optional[StateMachineRuntime] = None
|
||||
|
||||
def set_runtime_logging_context(self, *, endpoint_name: str, datasource_type: str) -> None:
|
||||
self._endpoint_name = endpoint_name
|
||||
self._datasource_type = datasource_type
|
||||
|
||||
def _datasource_log_prefix(self) -> str:
|
||||
scope = self._collection.scope if self._collection is not None else "unbound"
|
||||
return f"[{scope}][{self._endpoint_name}:{self._datasource_type}]"
|
||||
|
||||
def _node_log_prefix(self, node_type: str) -> str:
|
||||
return f"{self._datasource_log_prefix()}[{node_type}]"
|
||||
|
||||
def _ensure_sm_runtime(self) -> StateMachineRuntime:
|
||||
if self._sm_runtime is None:
|
||||
cfg_path = Path(__file__).resolve().parents[1] / "config" / "node_state_machine.yaml"
|
||||
@@ -469,7 +482,7 @@ class BaseDataSource(ABC):
|
||||
# Handler 加载数据并创建节点
|
||||
nodes = await handler.load()
|
||||
|
||||
logger.info("Loaded nodes for %s: %d", node_type, len(nodes))
|
||||
logger.info("%s Loaded nodes for %s: %d", self._datasource_log_prefix(), node_type, len(nodes))
|
||||
|
||||
# 将节点写入 Collection:优先按 data_id 命中已有节点并更新
|
||||
await self._upsert_loaded_nodes(handler, node_type, nodes)
|
||||
@@ -477,7 +490,7 @@ class BaseDataSource(ABC):
|
||||
# 统计加载的节点数
|
||||
self._stats[node_type]["loaded"] += len(nodes)
|
||||
except Exception as exc:
|
||||
logger.error("❌ [%s] 加载失败: %s", node_type, exc)
|
||||
logger.error("%s ❌ 加载失败: %s", self._node_log_prefix(node_type), exc)
|
||||
if raise_on_error:
|
||||
raise RuntimeError(f"[{node_type}] 加载失败: {exc}") from exc
|
||||
continue
|
||||
@@ -628,7 +641,7 @@ class BaseDataSource(ABC):
|
||||
|
||||
# 批量创建(传入节点列表)
|
||||
if create_nodes:
|
||||
logger.info(f"[{handler.node_type}] create提交开始: nodes={len(create_nodes)}")
|
||||
logger.info(f"{self._node_log_prefix(handler.node_type)} create提交开始: nodes={len(create_nodes)}")
|
||||
try:
|
||||
create_results = await handler.create_all(create_nodes)
|
||||
create_success = 0
|
||||
@@ -646,7 +659,7 @@ class BaseDataSource(ABC):
|
||||
create_skipped += 1
|
||||
await self._handle_task_result(handler, result, async_tasks)
|
||||
logger.info(
|
||||
f"[{handler.node_type}] create提交完成: success={create_success}, "
|
||||
f"{self._node_log_prefix(handler.node_type)} create提交完成: success={create_success}, "
|
||||
f"in_progress={create_in_progress}, failed={create_failed}, skipped={create_skipped}"
|
||||
)
|
||||
except Exception as e:
|
||||
@@ -682,7 +695,7 @@ class BaseDataSource(ABC):
|
||||
# 轮询异步任务
|
||||
if async_tasks and poll_async_tasks:
|
||||
logger.info(
|
||||
f"[{handler.node_type}] create已提交,push_id检查即将开始: pending={len(async_tasks)}, "
|
||||
f"{self._node_log_prefix(handler.node_type)} create已提交,push_id检查即将开始: pending={len(async_tasks)}, "
|
||||
f"first_wait={self._poll_interval:.3f}s"
|
||||
)
|
||||
await self._poll_async_tasks(handler, async_tasks)
|
||||
@@ -833,13 +846,13 @@ class BaseDataSource(ABC):
|
||||
|
||||
if async_tasks and poll_interval > 0:
|
||||
logger.info(
|
||||
f"[{handler.node_type}] push_id首次检查前等待 {poll_interval:.3f}s, pending={len(async_tasks)}"
|
||||
f"{self._node_log_prefix(handler.node_type)} push_id首次检查前等待 {poll_interval:.3f}s, pending={len(async_tasks)}"
|
||||
)
|
||||
await asyncio.sleep(poll_interval)
|
||||
|
||||
while async_tasks and retry_count < max_retries:
|
||||
logger.info(
|
||||
f"[{handler.node_type}] push_id检查 {retry_count + 1}/{max_retries}, pending={len(async_tasks)}"
|
||||
f"{self._node_log_prefix(handler.node_type)} push_id检查 {retry_count + 1}/{max_retries}, pending={len(async_tasks)}"
|
||||
)
|
||||
# 批量查询
|
||||
task_ids = list(async_tasks.values())
|
||||
|
||||
@@ -119,6 +119,11 @@ async def _create_datasource(
|
||||
datasource = datasource_factory(ds_config, endpoint_name, **factory_kwargs)
|
||||
if inspect.isawaitable(datasource):
|
||||
datasource = await datasource
|
||||
if hasattr(datasource, "set_runtime_logging_context"):
|
||||
datasource.set_runtime_logging_context(
|
||||
endpoint_name=endpoint_name,
|
||||
datasource_type=ds_config.type,
|
||||
)
|
||||
return datasource
|
||||
|
||||
|
||||
|
||||
@@ -725,7 +725,7 @@ async def apply_auto_bind_updates(
|
||||
|
||||
if pending_auto_bind_updates:
|
||||
ordered = ", ".join(f"{key}={outcome_counts[key]}" for key in sorted(outcome_counts))
|
||||
logger.info(
|
||||
logger.debug(
|
||||
"[%s] Auto-bind summary: candidates=%d, bind_pairs=%d, create_enabled=%d, outcomes={%s}",
|
||||
node_type,
|
||||
len(pending_auto_bind_updates),
|
||||
|
||||
@@ -116,7 +116,7 @@ async def _cleanup_one_side(
|
||||
reason = "status=FAILED" if node.status == SyncStatus.FAILED else "data_id empty"
|
||||
else:
|
||||
reason = "persistence_only_source_missing_without_binding"
|
||||
logger.info(
|
||||
logger.debug(
|
||||
f"[{node_type}] Cleaning up bootstrap zombie ({label}): "
|
||||
f"node_id={node.node_id}, reason={reason}, {bind_note}"
|
||||
)
|
||||
|
||||
@@ -45,7 +45,7 @@ def emit_schema_diff_report(strategy, validator: SchemaDiffValidator) -> None:
|
||||
if not validator.has_records():
|
||||
return
|
||||
for line in validator.format_summary_lines():
|
||||
logger.info(f"[{strategy.node_type}] validate {line}")
|
||||
logger.debug(f"[{strategy.node_type}] validate {line}")
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -361,7 +361,7 @@ async def prepare_directional_update(
|
||||
target_node.error = None
|
||||
diff_text = "; ".join(diff_descriptions) if diff_descriptions else "(未生成差异明细)"
|
||||
target_node.append_log(f"检测到差异: 从节点 {source_node.node_id} 更新数据 | fields={diff_text}")
|
||||
logger.info(f"[{strategy.node_type}] 更新差异字段: target={target_node.node_id}, {diff_text}")
|
||||
logger.debug(f"[{strategy.node_type}] 更新差异字段: target={target_node.node_id}, {diff_text}")
|
||||
logger.debug(f"[{strategy.node_type}] 更新准备完成: target={target_node.node_id}, reason={reason}")
|
||||
return target_node
|
||||
|
||||
|
||||
Reference in New Issue
Block a user