3、日志采集技术:Filebeat 基础配置、Logstash 管道处理、Fluentd 插件生态、日志采集最佳实践

日志采集,说白了就是大屏监控系统的「眼睛」。数据采不上来,后面再炫酷的可视化都是白搭。我这些年踩过的坑,有一半都出在日志采集这一层。今天咱们就把 Filebeat、Logstash、Fluentd 这三兄弟掰开揉碎聊清楚。

3.1 Filebeat 基础配置:轻量级采集的「尖兵」

Filebeat 是 Elastic 家的轻量级日志采集器。为什么说它「轻」?因为它用 Go 写的,资源占用极低。我在项目中见过一台 2C4G 的虚拟机,同时跑 3 个 Filebeat 实例,CPU 占用不到 5%。

核心配置要点:

  • input 配置:定义从哪读日志。支持文件、stdin、syslog 等。
  • output 配置:日志发往哪里。常见的有 Elasticsearch、Logstash、Kafka。
  • registry 文件:记录读取进度。Filebeat 重启后能接着读,不会丢数据。

来看一个最基础的配置示例:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    service: nginx
    env: production

output.elasticsearch:
  hosts: ["http://192.168.1.100:9200"]
  index: "nginx-access-%{+yyyy.MM.dd}"

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat.log
  keepfiles: 7

嗯,这里要注意 registry 文件。我曾经有一次手贱删了它,结果 Filebeat 重新读取了所有历史日志,把 ES 集群直接打挂了。所以——千万别动 registry 文件,除非你清楚自己在干什么。

我的小技巧:生产环境建议把 output 先指向 Kafka,而不是直接怼 ES。这样即使 ES 挂了,日志也不会丢。Kafka 作为缓冲层,稳得很。

3.2 Logstash 管道处理:数据加工的「中央厨房」

Logstash 的核心是管道(Pipeline)。数据进来,经过 input → filter → output 三个阶段。我个人习惯把 filter 阶段当作「数据清洗车间」。

为什么会需要 Logstash?你想想看,原始日志通常是乱七八糟的。Nginx 的日志格式、Java 的堆栈信息、数据库的慢查询日志……格式千奇百怪。Logstash 就是用来把这些「脏数据」洗成统一格式的。

一个典型的 Logstash 管道配置:

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
    target => "@timestamp"
  }
  mutate {
    remove_field => ["message", "original"]
  }
}

output {
  elasticsearch {
    hosts => ["http://192.168.1.100:9200"]
    index => "weblog-%{+yyyy.MM.dd}"
  }
}

我在项目中遇到过最头疼的问题:grok 正则写错了。有一次我写了个贪婪匹配,结果 Logstash 处理单条日志花了 3 秒,整个管道直接堵死。后来我学乖了——先用 grok debugger 工具验证正则,再上线。

避坑指南:我曾经在生产环境直接修改 Logstash 配置并 reload,结果管道状态没更新,数据丢了 2 小时。后来我改成「先停采集、再改配置、最后重启」的流程。虽然麻烦点,但稳。

3.3 Fluentd 插件生态:灵活到「变态」的采集框架

Fluentd 是 Treasure Data 家的开源项目。它的插件生态是我见过最丰富的——官方和社区加起来有 1000+ 个插件。说白了,只要你能想到的数据源,基本都有现成的插件。

Fluentd 的核心设计理念是「统一日志层」。它用 JSON 格式统一所有日志,然后用插件做输入、解析、输出。我个人觉得,Fluentd 的灵活性比 Logstash 强,但性能稍弱一些。

来看一个 Fluentd 配置示例:

<source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.log.pos
  tag nginx.access
  <parse>
    @type nginx
  </parse>
</source>

<filter nginx.access>
  @type record_transformer
  <record>
    service nginx
    env ${record["env"] || "production"}
  </record>
</filter>

<match nginx.access>
  @type elasticsearch
  host 192.168.1.100
  port 9200
  index_name fluentd-nginx
  <buffer>
    @type file
    path /var/log/td-agent/buffer/nginx
    flush_interval 5s
  </buffer>
</match>

Fluentd 的 buffer 机制是我特别喜欢的。它把数据先缓存到本地文件,再批量发送。这样即使 ES 挂了,数据也不会丢。我在一个日处理 10 亿条日志的项目中,就是靠 Fluentd 的 buffer 扛住了 ES 的两次宕机。

插件推荐:

插件名称 用途 我的评价
fluent-plugin-kafka 输出到 Kafka 生产环境必备,稳如老狗
fluent-plugin-rewrite-tag-filter 动态修改 tag 路由日志的利器
fluent-plugin-elasticsearch 输出到 ES 支持批量写入,性能不错
fluent-plugin-grok-parser 解析非结构化日志 和 Logstash 的 grok 类似

3.4 日志采集最佳实践:我踩过的坑,你别再踩

做了这么多年数据架构,日志采集的坑我基本都踩了一遍。下面这几条,是我用真金白银换来的经验。

  1. 永远不要直接采集到 ES。中间加一层 Kafka 或 Redis,成本不高,但能救命。
  2. 日志格式必须统一。我见过一个项目,3 个团队用了 5 种日志格式,最后解析规则写了 200 行。统一格式,能省 80% 的解析工作。
  3. 采集端必须做限流。Filebeat 和 Fluentd 都支持 rate_limit 配置。我曾经没配限流,结果日志量暴增时直接把 ES 打挂了。
  4. 监控采集器本身。采集器挂了,你都不知道。我习惯给每个采集器配一个心跳日志,每 5 秒发一条「我还活着」的消息。
  5. 日志轮转要配合好。Linux 的 logrotate 和采集器的 registry 文件要协调。我见过 logrotate 把日志删了,但 Filebeat 还在读旧文件,结果一直报错。

我的选择建议:

  • 小规模(< 10 台服务器):Filebeat + ES,简单直接
  • 中等规模(10-100 台):Filebeat + Kafka + Logstash + ES,灵活可控
  • 大规模(> 100 台):Fluentd + Kafka + 自研处理引擎,定制化强

最后说一句:日志采集没有银弹。每个公司的业务场景、技术栈、团队能力都不一样。我的建议是——先跑通最简单的方案,再逐步优化。别一开始就想着搞个完美的架构,结果半年都上不了线。

嗯,这一章就聊到这儿。下一章咱们讲讲「数据清洗与转换」,到时候我会分享一个我处理过的「脏数据」案例,保证让你大开眼界。