目标:采得到、查得快、能关联、合规可审计。所有日志统一为 JSON,且带可关联字段。
一、采集架构
容器 stdout/stderr → Fluent Bit(DaemonSet) → Kafka(可选缓冲) → Loki → Grafana
- 采集端:Fluent Bit(轻量,DaemonSet),自动附加
namespace/pod/container/node。 - 存储:Loki(与 Prometheus/Grafana 同栈,成本低);审计类日志可单独 ES。
二、日志格式(结构化 JSON)
必带字段:
json
{
"timestamp": "2026-09-17T11:00:00.123Z",
"level": "ERROR",
"service": "order-service",
"env": "prod",
"trace_id": "a1b2c3d4...",
"msg": "create order failed",
"error": "TimeoutException",
"latency_ms": 3200,
"user_id": "u_12345"
}
level:DEBUG / INFO / WARN / ERROR / FATALtrace_id:有请求上下文时必须带,用于和链路追踪关联下钻- 时间戳用 ISO8601 UTC
三、分级与打印纪律
- 禁止打印敏感字段:手机号、身份证、token、密码、银行卡 → 采集端或代码层脱敏(如
138****8000)。 - 控制频率:避免每秒上万条;批量/采样,必要时降级为计数。
- 单行大小限制(如 < 16KB),避免撑爆采集。
- ERROR 必须含可定位信息(trace_id + 关键参数 + 异常类型),不要只写 "error"。
四、留存与成本
| 级别 | 留存 | 说明 |
|---|---|---|
| DEBUG | 3--7 天 | 排障用,短留 |
| INFO | 15--30 天 | |
| ERROR/FATAL | 60--90 天 | 便于复盘 |
| 审计日志 | 180 天+ | 合规要求,独立存储防篡改 |
- 冷热分层:热存 SSD/Loki,冷数据转对象存储降成本。
- 索引按
service/env分,避免互相影响。
五、K8s 场景要点
- 只采 stdout/stderr(标准输出),不进容器里捞文件。
- 用 Pod annotation 自动附加业务标签。
- 多租户:按 namespace 路由到不同 Loki 流/索引。
六、日志告警
- 错误率突增:同服务 ERROR 分钟级计数超阈值 → 告警(配合指标更准)。
- 关键字:如
OutOfMemoryError、Connection refused、PANIC。 - 关联:日志告警携带
trace_id,点击直接跳链路。