生产日志工程:结构化、采样、脱敏与成本治理实战

2026-06-12 14:22:53
# 生产日志工程实战 > 背景:某团队 ELK 月账单 12 万 → 优化后 3.5 万,排障效率不降 ## 一、结构化日志标准 ### 1.1 必选字段 ```json { "timestamp": "2026-06-12T08:00:00.123Z", "level": "INFO", "service": "order-service", "traceId": "abc123", "spanId": "def456", "tenantId": "t001", "msg": "order created", "orderId": "ORD12345678", "duration_ms": 45 } ``` **禁止**:纯文本 `log.info("order " + id + " created")`。 ### 1.2 Logback JSON 配置 ```xml traceId timestamp msg ``` --- ## 二、Trace 关联 OpenTelemetry Agent 自动注入 `traceId` 到 MDC;手动: ```java MDC.put("traceId", Span.current().getSpanContext().getTraceId()); try { log.info("processing order {}", orderId); } finally { MDC.clear(); } ``` Kibana / Grafana 按 `traceId` 一键串联全链路。 --- ## 三、日志级别策略 | 环境 | 默认级别 | 动态调试 | |------|----------|----------| | prod | INFO | Actuator `/loggers` 临时 DEBUG | | staging | DEBUG | — | | dev | DEBUG | — | **生产禁止全局 DEBUG**——QPS 1000 时日志量 ×100。 动态调整(Spring Boot 3): ```bash curl -X POST actuators/loggers/com.example.order -d '{"configuredLevel":"DEBUG"}' # 30 分钟后自动恢复 INFO(定时任务) ``` --- ## 四、采样策略 ### 4.1 头部采样(推荐) - 错误日志:**100% 保留** - 成功 INFO:**1–10% 采样**(按 traceId hash) - 健康检查:**丢弃** ```java if (status == 200 && SamplingRate.shouldSample(traceId, 0.05)) { log.info("request completed"); } ``` ### 4.2 尾部采样(OTel Collector) Collector 侧保留慢请求 + 错误 span 关联的全量日志。 --- ## 五、PII 脱敏 | 字段 | 规则 | |------|------| | 手机号 | `138****5678` | | 身份证 | 保留前 3 后 4 | | 银行卡 | 仅后 4 位 | | 密码/Token | **禁止打印** | Logback `MaskingConverter` 或 logstash-filter-mask。 --- ## 六、成本治理 ### 6.1 索引字段控制 ELK 只对 **低基数、高查询** 字段建 keyword 索引: - ✅ `service`, `level`, `traceId`, `error.code` - ❌ `msg` 全文索引(改用 message 存储不索引) ### 6.2 热温冷分层 | 层 | 保留 | 存储 | |----|------|------| | Hot | 7d | SSD | | Warm | 30d | HDD | | Cold | 180d | S3/OSS | Loki **按标签流式存储**,成本通常为 ELK 1/3–1/5。 ### 6.3 日志量预算 每服务 **≤ 5 KB/请求**(INFO 成功路径)。超标 CI 告警。 --- ## 七、排障最佳实践 1. **先 Trace 后 Log**:定位慢在哪个 span 2. **结构化查询**:`service:order AND orderId:ORD*` 3. **关联 Metrics**:错误率 spike 时间点对齐日志 4. **Runbook 链接**:告警通知带 Wiki 链接 --- ## 八、Checklist - [ ] 全服务 JSON 格式统一 - [ ] traceId 100% 覆盖 HTTP 入口 - [ ] 生产无 DEBUG 默认 - [ ] PII 脱敏单测覆盖 - [ ] 180d 保留策略合规 - [ ] 月成本 Dashboard --- ## 小结 日志工程的目标不是「记越多越好」,而是 **可检索、可关联、可负担**。国内 2026 年趋势是从 ELK 全量索引转向 **Loki + 采样 + 热温冷**,在等保审计与成本之间取得平衡。