第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索引写入拒绝:自动切换到备集群或临时写入对象存储,待集群恢复后补录。

验收标准

  1. 采集端在弱网(30%丢包、延迟500ms)下,日志丢失率≤1%;
  2. 传输链路端到端延迟(从发送到ES可查)P99<5s;
  3. 存储系统支持每天10亿条日志写入,查询响应P99<2s;
  4. 关键字段(crash类型、堆栈摘要)索引正确率≥99.9%;
  5. 所有节点配置通过安全扫描(TLS版本>=1.2、无弱加密套件)。

日志采集平台架构总览

日志采集平台架构图 日志采集平台整体架构 移动端 SDK iOS / Android 服务端 Agent Filebeat / Fluent Bit 嵌入式采集端 C++ 轻量库 传输层 HTTP/2 · gRPC TLS + GZIP + AES 消息队列 Kafka / Pulsar 热存储 Elasticsearch 温/冷存储 ClickHouse / OSS 查询API RESTful 检索 采集端注意 本地缓存、采样率、 断网重试、流量控制 存储规划关键 数据生命周期、索引 分片策略、冷热分离