生产日志工程:结构化、采样、脱敏与成本治理实战
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 + 采样 + 热温冷**,在等保审计与成本之间取得平衡。