第十三章:系统日志、TraceID与可观测性设计
这一章开始,系统从:
“能运行的分布式系统”
升级为:
“可观测、可追踪、可定位问题的生产级系统”
13.1 当前系统的真实问题
虽然我们已经具备:
企业微信 → FastAPI → Redis → Worker → AI → 回复
但在生产环境中会出现一个核心问题:
❌ 系统“黑盒化”
典型问题
用户说:为什么没回复?
你无法快速回答:
- 消息在哪一步卡住?
- 是 Webhook 问题?
- Redis 问题?
- Worker 问题?
- AI超时?
- 还是发送失败?
❌ 日志分散
FastAPI日志一份
Worker日志一份
AI调用日志一份
Redis日志一份
无法串联。
❌ 无法追踪单条消息
一条用户消息 → 多个系统组件
但没有统一ID
13.2 本章目标
构建一套完整的:
✔ TraceID贯穿全链路
✔ 结构化日志
✔ 请求级追踪
✔ Worker可观测
✔ AI调用可记录
13.3 TraceID设计(核心思想)
📌 什么是 TraceID?
一条消息在系统中的“身份证”
📌 贯穿链路
企业微信消息
↓ trace_id=abc123
FastAPI
↓
Redis Queue
↓
Worker
↓
LLM
↓
Send API
13.4 TraceID生成规则
📌 建议方案
trace_id = uuid4().hex
📌 utils/id.py
import uuid
def generate_trace_id():
return uuid.uuid4().hex
13.5 日志系统设计(Loguru)
📌 选择 Loguru
原因:
- ✔ 无需复杂配置
- ✔ 支持结构化日志
- ✔ 支持文件分割
- ✔ 支持上下文绑定
13.6 logger.py(核心实现)
from loguru import logger
import sys
logger.remove()
logger.add(
sys.stdout,
format="{time} | {level} | {extra[trace_id]} | {message}",
level="INFO"
)
13.7 TraceID绑定机制
📌 核心思想
每条请求绑定一个上下文变量
📌 utils/context.py
from contextvars import ContextVar
trace_id_var = ContextVar("trace_id", default=None)
def set_trace_id(trace_id: str):
trace_id_var.set(trace_id)
def get_trace_id():
return trace_id_var.get()
13.8 Logger增强(自动注入TraceID)
📌 logger升级
from loguru import logger
from app.utils.context import get_trace_id
def log(message: str):
trace_id = get_trace_id()
logger.bind(trace_id=trace_id).info(message)
13.9 FastAPI接入TraceID
📌 callback入口改造
from app.utils.id import generate_trace_id
from app.utils.context import set_trace_id
from app.logger import log
@router.post("/callback")
async def callback(request: Request):
trace_id = generate_trace_id()
set_trace_id(trace_id)
log("收到企业微信请求")
body = await request.body()
log("开始解析XML")
...
13.10 Worker接入TraceID
📌 worker改造
from app.utils.context import set_trace_id
from app.logger import log
async def process(message: dict):
trace_id = message.get("trace_id")
set_trace_id(trace_id)
log(f"开始处理消息: {message.get('Content')}")
13.11 Redis消息结构升级
📌 必须携带 trace_id
{
"trace_id": "abc123",
"FromUserName": "user1",
"Content": "你好",
"MsgId": "xxx"
}
13.12 全链路日志效果
📌 示例输出
2026-07-03 09:40:12 | INFO | abc123 | 收到企业微信请求
2026-07-03 09:40:12 | INFO | abc123 | 解密成功
2026-07-03 09:40:12 | INFO | abc123 | 写入Redis队列
2026-07-03 09:40:13 | INFO | abc123 | Worker开始处理
2026-07-03 09:40:15 | INFO | abc123 | AI返回成功
13.13 可观测性能力提升
✔ 改造前
❌ 只能看日志文件
❌ 无法关联请求
❌ 无法定位问题
✔ 改造后
✔ 一条消息全链路可追踪
✔ 每一步都有日志
✔ 可定位任意节点问题
13.14 Worker错误定位能力
现在可以精确回答:
“这条消息为什么没回复?”
答案:
trace_id = abc123
卡在:
→ LLM超时(15s)
13.15 系统架构升级(可观测版)
企业微信
↓
FastAPI (trace_id)
↓
Redis Queue (trace_id)
↓
Worker (trace_id)
↓
LLM (trace_id)
↓
WeCom Send (trace_id)
↓
Log System(统一输出)
13.16 本章核心价值
这一章完成后:
👉 系统从“可运行”
升级为
👉 “可观测系统”
13.17 当前系统能力总结
✅ 已完成能力
✔ AI对话系统
✔ 异步队列
✔ Worker架构
✔ Token管理
✔ 幂等机制
✔ 重试机制
✔ 死信队列
✔ TraceID追踪
✔ 结构化日志
🚀 下一章预告(第十四章)
第十四章:系统性能优化与限流设计(企业级稳定性)
下一章我们将进入:
✔ 并发控制
✔ Redis限流
✔ AI请求保护
✔ Worker负载均衡
✔ 系统抗压能力设计
👉 到这一章结束:
系统将具备真正的:
“高并发企业级 AI 服务能力”