小记:
------为什么要写这篇关于后端日志管理?
目前AI编程确实很厉害,但是AI写的代码,我们如何纠错,如何定位问题也是一件头疼的事情。把项目部署的服务器上了,但是运行时候报错,找不到原因。太烦人了。
企业级项目里,日志一般要记什么?
一个设计良好的日志系统,核心是记录 "谁、什么时候、做了什么、结果如何" ,并为每个请求标记一个唯一ID,把分散的日志串成一条线
请求维度的「可串联」信息(排障第一优先级)
- Request ID / Trace ID:全链路唯一,响应头带回给前端。
- 用户/租户标识:在合规前提下记业务 user id、租户 id(注意脱敏与权限)。
- 接口:方法 + 路径(或路由名),必要时含 query 摘要(避免把密钥、整段 body 打进日志)。
- 结果:HTTP 状态码、业务错误码;耗时(latency)。
- 上下游:调了哪个外部服务(向量库、LLM)、是否重试、超时设置。
业务与审计(合规、运营、安全)
- 关键业务动作:创建/删除资源、支付、权限变更等(谁、何时、对什么对象、结果)。
- 安全相关:登录失败次数、可疑 IP、鉴权失败(不要打明文 token/密码)。
- 异步任务:
task_id、队列名、阶段、成功/失败原因(与 HTTP 请求用同一 trace id 关联)。
错误与诊断
- 异常:带 stack trace(
logger.exception),且带上 request_id。 - 降级与熔断:例如向量检索失败回退、限流触发,便于区分「正常慢」和「故障路径」。
环境与部署
- 服务名、实例 id、版本/commit、环境(prod/staging),便于多副本、多版本混跑时定位。
体量与隐私
- 采样(高 QPS 接口可只抽一部分打 DEBUG)。
- 脱敏:手机号、证件、token、完整 prompt/文档内容往往不进日志或只打 hash/长度。
记日志的方法
| 方式 | 记什么 | 典型用途 |
|---|---|---|
| Access log(访问日志) | 每个 HTTP 请求一行:时间、IP、方法、URL、状态码、字节数、耗时 | 流量分析、404/5xx 统计、按路径查问题 |
| 应用结构化日志 | JSON 一行一条:level, time, service, trace_id, msg, extra |
用 ELK、Loki、Datadog 等检索、告警 |
| 中间件 / 过滤器 | 请求进入打「开始」、离开打「结束+耗时+状态」;统一注入 trace id | 不用每个接口手写 |
| OpenTelemetry(Tracing) | Span:服务间调用树、耗时分解 | 微服务、外部依赖多时用 |
| 集中式日志平台 | 把各机/各容器的日志/agent 送到统一存储 | 搜索、仪表盘、告警 |
| 日志级别策略 | prod 多为 INFO+,DEBUG 只在排障窗口打开 | 控成本、控磁盘与隐私风险 |
| 业务审计日志 | 与「调试日志」分开存储/保留周期 | 合规与运营报表 |
创建一个中间件。对于每个请求,它都会:
-
生成/提取 RequestID:如果没有则生成一个 UUID 供全链路使用,这是串起所有日志的关键。
-
自动记录请求信息:处理前记录下请求的方法、路径、客户端IP等。
-
记录响应和耗时:处理后计算耗时,并记录响应状态码