日志采集工具: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
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}"
}
}
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"]
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 集中处理方便管理,各司其职,多好。
好了,这一章就聊到这儿。下一章咱们讲讲日志数据的清洗和结构化,那才是真正考验功夫的地方。