日志工程基础:日志的分类与采集架构

在构建可观测性体系时,日志是最原始、最丰富的数据源。SRE 团队需要理解日志的分类方式与采集架构,才能设计出高可靠、低延迟的日志管道。本节从分类与采集两个维度展开,为后续 Golden Signals 指标提取奠定基础。

2.1 日志的分类

根据用途与合规要求,日志通常分为三类:业务日志、系统日志与审计日志。三类日志在内容、生命周期与访问控制上存在显著差异。

分类 定义 典型内容 存储周期 访问控制
业务日志 记录用户操作、交易流程、服务调用等业务行为 订单创建、支付回调、API 响应码、用户登录 7–30 天(热) / 90–180 天(温) 按角色与业务域隔离
系统日志 记录操作系统、中间件、基础设施的运行状态 CPU 使用率、磁盘 I/O、OOM 事件、服务重启 30–90 天(热) / 1 年(冷) 运维与 SRE 团队可读
审计日志 记录权限变更、数据访问、配置修改等合规事件 sudo 执行、IAM 策略变更、数据库 DDL 1–7 年(不可篡改) 仅审计与安全团队可写
SRE 实践提示: 业务日志与系统日志的采集管道可以共用,但审计日志必须独立存储并启用写后校验(如 SHA-256 链式哈希),防止篡改。

2.2 日志的采集架构

日志采集架构经历了从“推模型”到“拉模型”、从“单点采集”到“边车代理”的演进。当前主流方案包括 Agent、Fluentd 与 Logstash 三种模式。

2.2.1 Agent 模式(轻量级采集器)

Agent 模式在每个节点上部署独立的采集进程,直接读取本地日志文件或标准输出,通过协议(HTTP / gRPC / Kafka)将日志发送到后端。典型实现包括 Filebeat、Vector、Fluent Bit。

  • 优点: 资源占用低(通常 < 50MB 内存)、配置简单、支持自动发现日志文件。
  • 缺点: 缺乏复杂过滤与转换能力,多行日志(如 Java 异常栈)需额外配置。
  • 适用场景: 容器化环境(Kubernetes DaemonSet)、边缘节点、资源受限设备。

2.2.2 Fluentd 模式(统一日志层)

Fluentd 采用插件化架构,通过 Input → Buffer → Output 管道处理日志。它支持丰富的输入源(tail、syslog、HTTP)与输出目标(Elasticsearch、S3、Kafka)。

  • 优点: 内置缓冲与重试机制、插件生态丰富(超过 1000 个)、支持标签路由。
  • 缺点: 内存占用较高(Ruby 运行时)、高吞吐场景需调优 Buffer 参数。
  • 适用场景: 混合架构(物理机 + 虚拟机 + 容器)、需要复杂数据路由的中型集群。

2.2.3 Logstash 模式(全功能管道)

Logstash 是 ELK 栈的核心组件,提供强大的 Grok 解析、过滤与转换能力。它支持从多种输入(Beats、TCP、Kafka)接收数据,并输出到 Elasticsearch 或其他存储。

  • 优点: 解析能力最强(Grok 正则、KV、JSON)、内置大量 filter 插件、与 Elasticsearch 深度集成。
  • 缺点: 资源消耗大(Java 堆内存 1–4GB)、启动慢、Pipeline 配置复杂。
  • 适用场景: 需要复杂日志解析(如 Nginx 日志、数据库慢查询)、数据清洗要求高的企业级部署。
架构选型对比:
维度 Agent(Filebeat) Fluentd Logstash
内存占用 ~30 MB ~200 MB ~1–4 GB
解析能力 基础(JSON / 正则) 中等(正则 + 插件) 强大(Grok + 自定义)
吞吐量 高(单核 10K+ 行/秒) 中(单核 5K–8K 行/秒) 中(单核 3K–6K 行/秒)
部署复杂度 低 中 高

2.3 日志采集架构图

下图展示了一个典型的混合采集架构:Agent 负责边缘节点,Fluentd 作为统一路由层,Logstash 承担复杂解析任务,最终汇聚到后端存储。

日志采集混合架构 日志采集混合架构(Agent + Fluentd + Logstash) 业务应用日志 系统基础设施日志 审计安全日志 Filebeat / Vector Fluent Bit 审计 Agent(独立) Fluentd(统一路由) Logstash(复杂解析) Elasticsearch / Loki S3 / GCS(冷存储) 审计日志直写不可变存储 业务/系统日志可走路由层

2.4 采集配置示例

以下是一个 Fluentd 配置片段,展示如何从容器标准输出采集日志,添加标签并路由到 Elasticsearch:

<source>
  @type tail
  path /var/log/containers/*.log
  pos_file /var/log/fluentd-containers.log.pos
  tag kubernetes.*
  format json
  read_from_head true
</source>

<filter kubernetes.**>
  @type record_transformer
  <record>
    hostname "#{Socket.gethostname}"
    service_name ${record["kubernetes"]["labels"]["app"]}
  </record>
</filter>

<match kubernetes.**>
  @type elasticsearch
  host elasticsearch-logging
  port 9200
  logstash_format true
  logstash_prefix k8s-logs
  flush_interval 5s
</match>
避坑提醒: 采集配置中 pos_file 必须持久化到宿主机磁盘,否则容器重启后会导致重复采集或日志丢失。同时,建议为每个采集管道设置独立的 buffer_chunk_limit 与 flush_interval,避免背压导致 OOM。

2.5 分类与采集的协同策略

在实际工程中,日志分类与采集架构需要协同设计:

  • 业务日志: 使用 Agent 采集 + Fluentd 路由,保留 30 天热数据,用于 Golden Signals 的延迟与错误率计算。
  • 系统日志: 使用 Agent 采集 + Logstash 解析(Grok 提取 CPU/内存指标),保留 90 天,用于饱和度与容量规划。
  • 审计日志: 使用独立 Agent 直写对象存储(S3 / GCS),启用 WORM 策略,保留 7 年,仅通过 API 查询。

通过这种分层策略,SRE 团队既能保证 Golden Signals 指标的实时性,又能满足合规审计的长期存储需求。