其他
Python 应用可观测性建设:结构化日志…
在 Python 应用中添加结构化日志、指标采集、分布式追踪和关联 ID 传播,以便在生产环境快速定位问题。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 50/100 ×0.15
适用场景
Python 应用可观测性建设:结构化日通用
解决思路
- 使用 structlog 配置 JSON 结构化日志:在 processors 中依次加入 merge_contextvars、add_log_level、TimeStamper(fmt="iso")、StackInfoRenderer、format_exc_info、JSONRenderer,并设置 wrapper_class、context_class、logger_factory 和 cache_logger_on_first_use=True,在应用启动时初始化。
- 为每条日志添加一致的标准字段:用 ContextVar 保存 correlation_id,在日志中统一带上 correlation_id、method、path、user_id、status_code、duration_ms、error_type、error_message 等字段,便于过滤和关联。
- 按语义一致地使用日志级别:DEBUG 用于开发诊断(变量值、内部状态),INFO 用于请求生命周期和正常操作,WARNING 用于可恢复异常(重试、降级),ERROR 用于需要关注的失败(异常、服务不可用);不要把预期行为(如用户输错密码)记为 ERROR。
- 在入口处生成并传播关联 ID:用 uuid.uuid4() 生成 correlation_id,通过 ContextVar 和 structlog.contextvars.bind_contextvars 绑定到上下文;在 FastAPI 中间件中优先读取请求头 X-Correlation-ID,否则生成新 ID,并在响应头中回写。
- 向出站请求传播关联 ID:调用下游服务时在请求头中带上 X-Correlation-ID(如 httpx 的 headers={"X-Correlation-ID": correlation_id.get()})。
- 跟踪四大黄金信号:在每个服务边界记录延迟(latency)、流量(traffic)、错误(errors)和饱和度(saturation)。
- 限制指标标签基数:保持指标 label 值有界,绝不要使用 user ID 等无界值作为指标标签,以免存储成本爆炸。
- 在日志中包含上下文信息:记录 user ID、request ID、操作名称等,便于排查。
- 使用上下文管理器:统一处理计时和错误处理逻辑。
- 分离关注点:可观测性代码不应污染业务逻辑。
- 测试可观测性:在集成测试中验证日志和指标是否正确输出。
- 设置告警:没有告警的指标毫无价值,需为关键指标配置告警。
适用边界 · 注意事项
- 本地开发环境若不需要机器可读日志,可考虑使用人类可读格式而非 JSON。
- 不要将无界值(如用户 ID)用作指标标签。
- 不要将预期行为(如用户输错密码)记录为 ERROR 级别。