第2章 日志采集平台建设方案:采集端选型、传输链路设计、存储与查询规划
适用场景
- 移动端App(iOS / Android)Crash日志、ANR日志、卡顿日志的采集与上报;
- 服务端(Linux / Windows)程序异常、内存溢出、系统日志的集中采集;
- 嵌入式设备、IoT网关等资源受限环境下的日志轻量采集;
- 跨数据中心、混合云场景下日志的可靠传输与统一存储。
前置条件
- 已完成Crash指标定级与关键字段定义(参考第1章);
- 团队具备基础运维权限(云资源、消息队列、存储服务);
- 各端SDK版本兼容性清单已梳理;
- 网络带宽与延迟基准测试数据已准备。
操作步骤
Step 1:采集端选型
- 移动端:优先选用原生平台提供的崩溃监听(如iOS的NSSetUncaughtExceptionHandler、Android的Thread.setDefaultUncaughtExceptionHandler),结合第三方SDK(如Sentry、Firebase Crashlytics、自研CrashReporter);
- 服务端:选择Filebeat、Fluent Bit、Vector或自研agent,需支持多进程、日志轮转、断点续传;
- 嵌入式/IoT:使用轻量级C/C++采集库(如spdlog + 自定义上传模块),内存占用小于1MB。
// 示例:Android端初始化自研CrashReporter
CrashReporter.init(this)
.setServerUrl("https://log-internal.example.com/collect")
.setTags("version", "2.3.1")
.setLevel(LogLevel.WARNING)
.setSamplingRate(0.1) // 10%采样
.enableUploadInBackground(true);
Step 2:传输链路设计
- 协议选择:HTTP/2 长连接或 gRPC 流式传输,支持 TLS 1.2+;
- 队列缓冲:本地持久化缓存(如 SQLite、LevelDB)防止数据丢失,单文件上限 50MB;
- 压缩与加密:传输层使用 GZIP 压缩(压缩比≥5:1),负载使用 AES-256 加密;
- 消息中间件:引入 Kafka / Pulsar 解耦上下游,分区键按 app_id + device_id 哈希。
# 采集端agent配置示例 (Fluent Bit)
[SERVICE]
Flush 5
Daemon Off
Log_Level info
[INPUT]
Name tail
Path /var/log/app/*.log
DB /var/log/fluent.db
[OUTPUT]
Name kafka
Brokers 192.168.1.10:9092,192.168.1.11:9092
Topics crash_log
Retry_Limit 3
Step 3:存储与查询规划
- 热存储:使用 Elasticsearch 或 OpenSearch,索引按天滚动,分片数 = 集群节点数 × 2;
- 温存储:Apache Doris / ClickHouse 用于聚合查询与仪表盘;
- 冷存储:对象存储(S3 / OSS) + Parquet 格式,保留周期≥6个月;
- 查询接口:提供 RESTful API(支持时间范围、crash类型、版本号过滤)以及全文检索。
# Elasticsearch索引模板(crash_log_template)
{
"index_patterns": ["crash_log-*"],
"settings": {
"number_of_shards": 6,
"number_of_replicas": 1,
"refresh_interval": "30s"
},
"mappings": {
"properties": {
"app_id": {"type": "keyword"},
"device_id": {"type": "keyword"},
"crash_time": {"type": "date"},
"stack_trace": {"type": "text", "analyzer": "ik_max_word"},
"os_version": {"type": "keyword"}
}
}
}
输入输出物
| 阶段 |
输入物 |
输出物 |
| 采集端选型 |
各端SDK兼容性矩阵、Crash字段定义 |
采集端选型决策表、SDK集成指南 |
| 传输链路设计 |
网络拓扑图、带宽压测报告 |
链路架构图、Kafka Topic设计文档、加密/压缩方案 |
| 存储与查询规划 |
预估日增日志量、QPS指标 |
存储选型方案、索引模板、查询API设计文档 |
责任边界
| 责任方 |
职责 |
协作接口 |
| 客户端开发组 |
集成采集SDK、处理回调异常、本地缓存策略 |
提供设备标识生成规则、字段扩展请求 |
| 后端/SRE组 |
搭建Kafka集群、配置ES索引、运维存储节点 |
提供接入点地址、消息队列消费延迟监控 |
| 稳定性治理专家 |
制定采集频率、采样率、关键字段白名单 |
审核传输安全合规、版本灰度策略 |
记录材料
- 各端SDK版本号及配置快照(记录在内部Wiki或Git仓库)
- 传输链路压测报告(包含吞吐量、99分位延迟、丢包率)
- 存储节点规模变更记录(扩容/缩容时间、影响范围)
- 每条Crash日志的原始传输header(携带时间戳、采集端版本、重试次数)
异常处理
⚠️ 常见异常与预案
- 采集端本地缓存满:自动触发LRU淘汰策略,优先丢弃历史最旧的日志;同时告警通知。
- 传输层TLS握手失败:降级为HTTP明文(需在自建内网环境下),并记录告警;。
- Kafka生产者超时:启动本地重试队列(max retries = 3),超过则暂存至本地磁盘。
- ES索引写入拒绝:自动切换到备集群或临时写入对象存储,待集群恢复后补录。
验收标准
- 采集端在弱网(30%丢包、延迟500ms)下,日志丢失率≤1%;
- 传输链路端到端延迟(从发送到ES可查)P99<5s;
- 存储系统支持每天10亿条日志写入,查询响应P99<2s;
- 关键字段(crash类型、堆栈摘要)索引正确率≥99.9%;
- 所有节点配置通过安全扫描(TLS版本>=1.2、无弱加密套件)。
日志采集平台架构总览