fix(quality): 质量检查引用已删除的 MatchStats.id 必然 500 + 检查无日志
生产实测: POST /admin/data-quality/run 100% 失败,且日志无任何记录。 根因链: 1. P0-02 把 MatchStats 主键改为 match_id(无 id 属性),但质量检查 查询仍写 MatchStats.id.is_(None) → AttributeError → 500 2. handler 无 logger 调用;未捕获异常走 uvicorn.error(默认 propagate=False),不经过 root handler → 内存日志页/文件日志 都看不到 traceback,排障无据可查 修复: - MatchStats.id → MatchStats.match_id(与 P0-02 模型对齐) - 成功路径记 info 日志(检查名=通过/未通过(计数)) - setup_logging 打开 uvicorn/uvicorn.error 的 propagate, 未捕获异常 traceback 进入内存缓冲与滚动文件 - 回归测试 3 例(mock session):修复前红(3 failed),修复后绿; 全量 329 passed 8 skipped 零回归
This commit is contained in:
@@ -80,6 +80,14 @@ def setup_logging(level: str = "INFO", log_file: str = "") -> None:
|
||||
if root.level == logging.NOTSET or root.level > logging.INFO:
|
||||
root.setLevel(getattr(logging, level.upper(), logging.INFO))
|
||||
|
||||
# uvicorn 的 logger 默认 propagate=False:未捕获异常的 traceback 只进
|
||||
# stderr,不经过 root 的任何 handler —— Admin 日志页与文件日志都看不到,
|
||||
# 线上 500 排障无据可查。打开 propagate 让它们进入内存缓冲/滚动文件。
|
||||
for uv_name in ("uvicorn", "uvicorn.error"):
|
||||
uv_logger = logging.getLogger(uv_name)
|
||||
if not uv_logger.propagate:
|
||||
uv_logger.propagate = True
|
||||
|
||||
if not any(isinstance(h, MemoryLogHandler) for h in root.handlers):
|
||||
handler = MemoryLogHandler()
|
||||
handler.setLevel(logging.INFO)
|
||||
|
||||
Reference in New Issue
Block a user