日志采集工具:Flume、Logstash、Filebeat的安装与配置、采集管道搭建实战

聊到搜索日志分析,第一步就是怎么把日志搞进来。你想想看,日志都散落在各个服务器上,总不能每台机器都手动去拷贝吧?这时候就需要专业的采集工具了。

市面上主流的采集工具有三个:Flume、Logstash、Filebeat。我这些年都折腾过,各有各的脾气。今天咱们就挨个聊聊它们的安装配置,再搭一条完整的采集管道。

一、Flume:老牌大厂的选择

Flume 是 Apache 家的,说白了就是为大数据场景设计的。我记得第一次接触它是在一个日处理 TB 级日志的项目里,那会儿它给我的印象就是——稳。

1. 安装与配置

安装其实很简单,解压即用。但要注意 Java 环境,Flume 依赖 JDK 1.8 以上。

# 下载解压
wget https://archive.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/local/
cd /usr/local/apache-flume-1.9.0-bin/

# 配置环境变量
export FLUME_HOME=/usr/local/apache-flume-1.9.0-bin
export PATH=$PATH:$FLUME_HOME/bin

配置的核心是写一个 agent 配置文件。我习惯把 source、channel、sink 分开定义,这样后期维护起来清晰。

# example.conf
# 定义 agent 名称和组件
agent.sources = r1
agent.channels = c1
agent.sinks = k1

# 配置 source:监听日志文件
agent.sources.r1.type = spooldir
agent.sources.r1.spoolDir = /var/log/app
agent.sources.r1.fileHeader = true

# 配置 channel:使用内存通道
agent.channels.c1.type = memory
agent.channels.c1.capacity = 10000
agent.channels.c1.transactionCapacity = 1000

# 配置 sink:输出到 HDFS
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = /flume/events/%y-%m-%d
agent.sinks.k1.hdfs.fileType = DataStream

# 绑定组件
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
我的经验:生产环境别用 memory channel,容易丢数据。我踩过这个坑,后来全换成了 file channel,虽然慢点但数据安全。

2. 启动与验证

flume-ng agent --conf conf --conf-file example.conf --name agent -Dflume.root.logger=INFO,console

启动后往 spoolDir 目录丢个日志文件,看看 HDFS 上有没有生成数据。有就说明通了。

二、Logstash:ELK 生态的瑞士军刀

Logstash 是 Elastic 家的,跟 Elasticsearch、Kibana 是铁三角。它的强项是数据处理能力,各种 filter 插件能把日志洗得干干净净。

1. 安装与配置

安装方式多样,我推荐用 yum 或 apt,省事。

# 添加 Elastic 仓库
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

# 安装
sudo apt-get update && sudo apt-get install logstash

配置 Logstash 就是写 pipeline 文件。我个人习惯把 input、filter、output 分开写,最后用 pipelines.yml 统一管理。

# /etc/logstash/conf.d/logstash-sample.conf
input {
  beats {
    port => 5044
  }
}

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

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-%{+YYYY.MM.dd}"
  }
}
注意:Logstash 吃内存很凶。我曾经在一个 4G 的机器上跑,结果 OOM 了。建议至少 8G 内存,JVM 堆大小设 4G 左右。

2. 启动与验证

sudo systemctl start logstash
sudo systemctl status logstash

启动后往 5044 端口发个测试数据,看看 Elasticsearch 里有没有索引生成。

三、Filebeat:轻量级采集利器

Filebeat 是 Elastic 家的轻量级采集器。说白了,它就是 Logstash 的瘦身版,只负责采集和转发,不处理数据。我特别喜欢它,因为资源占用极低。

1. 安装与配置

# 同样用 Elastic 仓库安装
sudo apt-get install filebeat

# 配置
sudo vim /etc/filebeat/filebeat.yml

配置核心就两个部分:输入和输出。

# filebeat.yml 关键配置
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    service: nginx
    env: production

output.elasticsearch:
  hosts: ["localhost:9200"]
  index: "filebeat-%{[fields.service]}-%{+yyyy.MM.dd}"

# 或者输出到 Logstash
# output.logstash:
#   hosts: ["localhost:5044"]
避坑指南:我曾经把 paths 写成了相对路径,结果 Filebeat 一直报错找不到文件。记住,paths 一定要用绝对路径。

2. 启动与验证

sudo systemctl start filebeat
sudo systemctl enable filebeat

# 查看采集状态
sudo filebeat test output

filebeat test output 检查连接是否正常,这个命令很实用。

四、采集管道搭建实战

光会安装配置还不够,得把整个管道串起来。我拿一个真实场景举例:采集 Nginx 日志,经过 Logstash 处理,最终存入 Elasticsearch。

1. 架构设计

组件 角色 部署位置
Filebeat 日志采集 Nginx 服务器
Logstash 日志处理 独立服务器
Elasticsearch 日志存储 独立服务器

2. 配置步骤

第一步:配置 Filebeat

在 Nginx 服务器上安装 Filebeat,配置采集 access.log,输出到 Logstash。

# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log

output.logstash:
  hosts: ["192.168.1.100:5044"]

第二步:配置 Logstash

在 Logstash 服务器上接收 Filebeat 数据,用 grok 解析日志,输出到 Elasticsearch。

# /etc/logstash/conf.d/nginx-pipeline.conf
input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  geoip {
    source => "clientip"
  }
}

output {
  elasticsearch {
    hosts => ["192.168.1.200:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
  }
}

第三步:启动验证

按顺序启动:Elasticsearch → Logstash → Filebeat。然后访问 Nginx 服务,看看 Elasticsearch 里有没有数据。

验证命令:

# 查看 Elasticsearch 索引
curl -X GET "localhost:9200/_cat/indices?v"

# 查询数据
curl -X GET "localhost:9200/nginx-access-*/_search?pretty"

五、选型建议

说了这么多,到底该用哪个?我根据项目经验给个参考:

  • Flume:适合大数据生态(Hadoop、Spark),数据量大且需要高吞吐的场景。我那个 TB 级项目就是用它。
  • Logstash:适合 ELK 生态,需要复杂数据处理的场景。比如日志格式不统一,需要 grok 解析。
  • Filebeat:适合轻量级采集,资源受限的场景。比如在几十台 Nginx 服务器上部署,Filebeat 几乎不占资源。

嗯,其实很多时候是组合使用。Filebeat 采集 + Logstash 处理 + Elasticsearch 存储,这是我最常用的黄金组合。你想想看,Filebeat 轻量采集不拖累业务,Logstash 集中处理方便管理,各司其职,多好。

好了,这一章就聊到这儿。下一章咱们讲讲日志数据的清洗和结构化,那才是真正考验功夫的地方。