Skip to content

Commit b59ffb2

Browse files
authored
Merge pull request #151 from ql-link/claude/api-log-coverage
feat(logging): 补核心 API 与 recall pipeline 的日志覆盖
2 parents 26c0ae6 + df0bb10 commit b59ffb2

5 files changed

Lines changed: 38 additions & 0 deletions

File tree

src/api/routes/internal.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from datetime import datetime
88

99
from fastapi import APIRouter, Header, HTTPException, Depends
10+
from loguru import logger
1011
from sqlalchemy.ext.asyncio import AsyncSession
1112

1213
from src.core.llm.response import APIResponse
@@ -54,6 +55,7 @@ async def get_system_providers(
5455
)
5556

5657
except Exception as e:
58+
logger.exception("/internal/llm 接口调用失败")
5759
return APIResponse(code=500, message=str(e), data=None)
5860

5961

@@ -97,6 +99,7 @@ async def get_user_configs(
9799
)
98100

99101
except Exception as e:
102+
logger.exception("/internal/llm 接口调用失败")
100103
return APIResponse(code=500, message=str(e), data=None)
101104

102105

@@ -134,4 +137,5 @@ async def get_user_usage(
134137
)
135138

136139
except Exception as e:
140+
logger.exception("/internal/llm 接口调用失败")
137141
return APIResponse(code=500, message=str(e), data=None)

src/api/routes/llm.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Optional, List
66

77
from fastapi import APIRouter, Header, HTTPException, Depends
8+
from loguru import logger
89
from pydantic import BaseModel, Field
910
from sqlalchemy.ext.asyncio import AsyncSession
1011

@@ -139,6 +140,7 @@ async def generate_text(
139140
except HTTPException:
140141
raise
141142
except Exception as e:
143+
logger.exception(f"/llm/generate 调用失败 (user={x_user_id})")
142144
return APIResponse(
143145
code=500,
144146
message=str(e),
@@ -183,6 +185,7 @@ async def event_generator():
183185
except HTTPException:
184186
raise
185187
except Exception as e:
188+
logger.exception(f"/llm 接口调用失败 (user={x_user_id})")
186189
return APIResponse(code=500, message=str(e), data=None)
187190

188191

@@ -214,6 +217,7 @@ async def embed_text(
214217
except HTTPException:
215218
raise
216219
except Exception as e:
220+
logger.exception(f"/llm 接口调用失败 (user={x_user_id})")
217221
return APIResponse(code=500, message=str(e), data=None)
218222

219223

@@ -250,6 +254,7 @@ async def rerank_documents(
250254
except HTTPException:
251255
raise
252256
except Exception as e:
257+
logger.exception(f"/llm 接口调用失败 (user={x_user_id})")
253258
return APIResponse(code=500, message=str(e), data=None)
254259

255260

@@ -283,4 +288,5 @@ async def extract_text_from_image(
283288
except HTTPException:
284289
raise
285290
except Exception as e:
291+
logger.exception(f"/llm 接口调用失败 (user={x_user_id})")
286292
return APIResponse(code=500, message=str(e), data=None)

src/api/routes/parse.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pathlib import Path
99

1010
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
11+
from loguru import logger
1112

1213
from src.config import settings
1314
from src.services.parse_task_service import ParseTaskService
@@ -87,6 +88,7 @@ async def extract_sync(
8788
"time_cost_ms": result["time_cost_ms"],
8889
}
8990
except Exception as e:
91+
logger.exception("/parser 接口处理失败")
9092
raise HTTPException(status_code=500, detail=str(e))
9193
finally:
9294
temp_workspace.safe_unlink(upload_path)
@@ -130,4 +132,5 @@ async def submit_async_task(request: TaskSubmitRequest):
130132
},
131133
)
132134
except Exception as e:
135+
logger.exception("/parser 接口处理失败")
133136
raise HTTPException(status_code=500, detail=str(e))

src/core/pipeline/recall/pipeline.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ async def execute(self, request: RecallRequest) -> RecallResponse:
6868
started_at = time.monotonic()
6969
self._validate(request)
7070

71+
# 入口日志:不记 query 原文(可能含用户敏感内容),只记可观测的元信息。
72+
logger.info(
73+
"[RecallPipeline] start user={} datasets={} docs={} top_k={} mode={}",
74+
request.user_id,
75+
len(request.dataset_ids or []),
76+
len(request.doc_ids or []),
77+
request.top_k,
78+
"parallel" if self._config.parallel else "serial",
79+
)
80+
7181
if self._config.parallel:
7282
per_source_results = await self._run_parallel(request)
7383
else:
@@ -82,6 +92,16 @@ async def execute(self, request: RecallRequest) -> RecallResponse:
8292
# 服务端固定返回候选上限:融合后按 top_k 截断(fuse 已按 fused_score 降序)。
8393
fused_hits = fused_hits[: request.top_k]
8494
elapsed_ms = int((time.monotonic() - started_at) * 1000)
95+
96+
# 结果日志:耗时、融合命中数、各路命中分布、失败路(已有数据,原先只进响应不落日志)。
97+
logger.info(
98+
"[RecallPipeline] done user={} elapsed_ms={} hits={} per_source={} failed={}",
99+
request.user_id,
100+
elapsed_ms,
101+
len(fused_hits),
102+
{s: len(success_hits.get(s, [])) for s in self._sources},
103+
failed_sources,
104+
)
85105
return self._build_response(
86106
query=request.query,
87107
fused_hits=fused_hits,

src/main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
108108
@app.exception_handler(RecallApiError)
109109
async def recall_api_error_handler(request: Request, exc: RecallApiError) -> JSONResponse:
110110
"""内部召回握手前错误统一响应:{code, message, data} + 对应 HTTP 状态。"""
111+
# 握手失败(鉴权 / 入参 / 限流等)记 warning:便于排查对接问题与发现异常调用。
112+
logger.warning(
113+
f"召回握手失败 {request.method} {request.url.path}: "
114+
f"code={exc.code} status={exc.status_code} msg={exc.message}"
115+
)
111116
return JSONResponse(
112117
status_code=exc.status_code,
113118
content={"code": exc.code, "message": exc.message, "data": None},

0 commit comments

Comments
 (0)