Logstash 8.x 入门实战:搭配 Filebeat + Elasticsearch 实现分布式日志采集分析
一、为什么需要分布式日志收集
在云原生与微服务架构下,业务被拆分为数十个独立服务,分散部署在物理机、容器、K8s 节点中,每台节点都会产生独立的日志文件。传统单机登录查看日志的方式,已经完全无法满足运维排查、业务分析的需求:
-
故障排查效率极低:请求链路跨多个服务,需要逐台登录服务器捞日志,无法串联完整调用过程
-
统计分析难以实现:PV/UV、接口耗时、错误率等核心指标,无法基于分散日志做统一统计
-
日志留存无保障:服务器磁盘故障、服务扩缩容都会导致日志丢失,无法满足合规审计要求
-
中间件日志难统一:Nginx、MySQL、Redis 等组件日志分散,无法做整体运维监控
业界针对这类问题的成熟解决方案是 Elastic Stack(原 ELK 技术栈),通过标准化的采集、清洗、存储、可视化全链路,实现海量分布式日志的统一管理。其中「Filebeat 采集 + Logstash 清洗 + Elasticsearch 存储」是最经典、最易落地的入门级架构,也是生产环境日志系统的基础方案。
二、核心组件与整体数据流
本文基于 Elastic Stack 8.15.x(当前官方长期稳定版) 进行讲解,8.x 版本是 Elastic 官方主推的稳定主线,默认开启全链路安全认证、原生支持 ECS 通用字段规范、性能与稳定性相较 7.x 有大幅提升。
2.1 各组件核心定位
-
Filebeat 轻量级日志采集器,用 Go 语言开发,内存占用仅几十 MB,安装在产生日志的业务服务器上。它会持续监听指定日志文件,增量读取日志内容,支持断点续传、日志轮转自动识别,保证日志不丢不重,是官方推荐的边缘采集端。
-
Logstash 数据处理管道,是整个链路的「清洗加工车间」。采用经典的 Input(输入源)→ Filter(过滤转换)→ Output(输出目的地)三段式架构,支持上百种输入输出插件,可对非结构化日志做解析、格式化、脱敏、富集等处理,将日志转为标准化结构后输出。
-
Elasticsearch 分布式全文搜索引擎,是日志的最终存储与检索载体。支持近实时的全文检索、多维度聚合分析,能够快速在 TB 级日志中检索关键字,也支持通过 DSL 语句统计各类业务指标。
-
Kibana 可视化交互平台,对接 Elasticsearch 数据,提供日志查询、仪表盘、告警、链路追踪等图形化功能,是日常运维分析的主要入口。
2.2 完整数据流
Nginx 产生访问日志 → Filebeat 监听文件增量采集 → 发送至 Logstash 5044 端口 → Logstash 解析日志、格式化字段、统一结构 → 写入 Elasticsearch 索引 → Kibana 可视化查询、统计、告警
三、环境准备
重要原则:Elastic Stack 所有组件的大版本必须完全一致,否则会出现协议不兼容、数据解析异常等问题,本文所有组件均采用 8.15.x 稳定版。
-
操作系统:CentOS 7.9+ / Ubuntu 20.04+(Linux 通用)
-
前置依赖:Logstash、Elasticsearch 均内置配套 JDK(8.x 内置 JDK 17),无需单独安装 Java 环境
-
基础环境:提前安装好 Elasticsearch 8.15.x 并正常启动,记录好 elastic 账号密码、CA 证书路径(8.x 默认开启 HTTPS 与身份认证)
-
服务器规划:建议 Logstash 单独部署,Filebeat 部署在业务服务器,Elasticsearch 独立集群部署
四、Logstash 8.x 安装与基础使用
4.1 下载与安装
- 从官方历史版本页面下载安装包,或直接通过 wget 下载:
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.15.0-linux-x86_64.tar.gz
- 解压到指定安装目录:
tar -zxvf logstash-8.15.0-linux-x86_64.tar.gz -C /opt/ cd /opt/logstash-8.15.0
- 环境变量配置(可选) Logstash 已内置配套 JDK,默认会自动识别。若系统存在多版本 JDK,可配置环境变量强制使用内置版本:
echo "export LS_JAVA_HOME=/opt/logstash-8.15.0/jdk" >> /etc/profile source /etc/profile
4.2 快速启动验证
我们先用最简单的「控制台输入、控制台输出」模式,验证 Logstash 基础运行能力:
bin/logstash -e 'input { stdin {} } output { stdout {} }'
-e:直接在命令行指定配置内容,无需编写配置文件,适合快速测试
启动等待十几秒,出现 Successfully started Logstash API endpoint 即代表启动成功。在控制台输入 hello logstash,回车后会看到结构化的输出结果,包含 message、host、@timestamp、@version 等字段。
按 Ctrl + D 可退出控制台模式。
4.3 核心配置结构说明
Logstash 所有配置都遵循三段式结构,这是理解 Logstash 的核心:
-
input:定义数据来源,比如接收 Filebeat 数据、读取文件、消费 Kafka 等
-
filter:定义数据处理逻辑,比如解析非结构化日志、字段转换、数据过滤、脱敏等
-
output:定义数据输出目的地,比如写入 Elasticsearch、输出到文件、发送到消息队列等
4.4 编写 Nginx 日志处理配置
我们创建一个专门处理 Nginx 访问日志的配置文件 config/nginx-log-pipeline.conf:
# 1. 输入源:接收 Filebeat 发送的日志
input {
beats {
port => 5044
# 生产环境建议开启 TLS 加密传输,配置证书
# ssl => true
# ssl_certificate_authorities => ["/path/to/ca.crt"]
}
}
# 2. 过滤器:解析 Nginx 日志为结构化字段
filter {
grok {
# 匹配 Nginx 默认 combined 格式日志
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# 转换时间字段,修正时区差,覆盖默认 @timestamp
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
# 可选:删除冗余字段
mutate {
remove_field => ["message", "timestamp"]
}
}
# 3. 输出:写入 Elasticsearch 8.x
output {
elasticsearch {
hosts => ["https://localhost:9200"]
index => "nginx-access-log-%{+YYYY.MM.dd}"
# 8.x 默认开启安全认证,配置账号密码
user => "elastic"
password => "你的ES密码"
# 配置 ES 的 CA 证书,解决 HTTPS 证书校验问题
ssl_certificate_authorities => ["/opt/elasticsearch-8.15.0/config/certs/http_ca.crt"]
}
# 调试时可开启控制台输出,验证解析结果
# stdout { codec => rubydebug }
}
配置说明:
-
8.x 版本 Elasticsearch 默认启用 HTTPS,连接时必须配置证书或关闭校验,生产环境不建议关闭校验
-
%{COMBINEDAPACHELOG}是 Logstash 内置的通用匹配模式,可直接解析 Nginx 默认 combined 格式日志 -
生产环境建议按天拆分索引,方便后续日志生命周期管理与过期删除
-
对于自定义格式的 Nginx 日志,可通过 Grok Debugger 在线工具调试自定义表达式
4.5 后台启动与配置重载
使用以下命令后台启动 Logstash,并开启配置自动重载,修改配置后无需重启即可生效:
nohup bin/logstash -f config/nginx-log-pipeline.conf --config.reload.automatic &
启动后可通过 logs/logstash-plain.log 查看运行日志,确认 5044 端口正常监听。
五、Filebeat 8.x 安装与对接配置
5.1 为什么选择 Filebeat
早期 ELK 架构会在每台服务器部署 Logstash 采集日志,但 Logstash 基于 Java 开发,资源占用高,会挤压业务服务资源。而 Filebeat 作为轻量级采集端,完美解决了这个问题:
-
资源占用极低,常态内存占用仅几十 MB
-
原生支持断点续传,重启后不会重复读取日志
-
自动识别日志轮转,日志文件切分后不会中断采集
-
内置大量官方模块,可一键接入 Nginx、MySQL、Redis 等常见组件
5.2 下载与安装
-
下载对应版本安装包:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.15.0-linux-x86_64.tar.gz
-
解压安装:
tar -zxvf filebeat-8.15.0-linux-x86_64.tar.gz -C /opt/
cd /opt/filebeat-8.15.0
5.3 修改核心配置
Filebeat 的核心配置文件是 filebeat.yml,我们需要配置「日志输入源」和「输出目的地」两部分。
注意:8.x 版本已废弃旧的
log输入类型,统一使用filestream类型作为文件采集标准输入。
-
配置日志输入源 找到
filebeat.inputs部分,修改为监听 Nginx 访问日志:filebeat.inputs:
- type: filestream
开启该采集配置
enabled: true日志文件路径,支持通配符
paths:- /www/wwwlogs/access.log
可配置多个路径
- /var/log/nginx/*.log
- type: filestream
-
配置输出到 Logstash 找到 Outputs 部分,注释掉默认的 elasticsearch 输出,开启 logstash 输出:
注释默认的 ES 直接输出
#output.elasticsearch:
hosts: ["localhost:9200"]
开启 Logstash 输出
output.logstash:
Logstash 服务地址与端口,对应 input 中配置的 5044 端口
hosts: ["192.168.65.114:5044"]
若 Logstash 开启 TLS,需配置证书
ssl.certificate_authorities: ["/path/to/ca.crt"]
5.4 启动与断点续传机制
后台启动 Filebeat:
nohup ./filebeat -e -c filebeat.yml -d "publish" &
Filebeat 会在 data/registry 目录下记录每个日志文件的读取偏移量,保证服务重启后从上次的位置继续读取,不会丢日志也不会重复采集。
- 如果需要清空历史记录、重新从头采集日志,可以停止 Filebeat 后删除
data/registry目录,再重新启动即可。
5.5 进阶:使用 Nginx 内置模块(生产推荐)
8.x 版本 Filebeat 内置了大量官方模块,其中 Nginx 模块可以自动解析访问日志、错误日志,输出符合 ECS 通用字段规范的结构化数据,无需手写 Grok 表达式,大幅降低配置成本:
# 查看可用模块
./filebeat modules list
# 启用 nginx 模块
./filebeat modules enable nginx
# 修改模块配置,指定日志路径
vim modules.d/nginx.yml
该方式适合生产环境标准化部署,字段统一、维护成本低。
六、Elasticsearch 8.x 基础使用与验证
6.1 Elasticsearch 简介
Elasticsearch 是基于 Lucene 构建的分布式全文搜索引擎,也是 Elastic Stack 的核心存储组件。8.x 版本在安全、性能、可观测性上做了大量增强:默认开启全链路安全认证、支持向量检索、存储性能优化等,非常适合日志存储、全文检索、数据分析场景。
6.2 验证日志写入
启动完 Filebeat 和 Logstash 后,访问几次 Nginx 站点产生新日志,通过 ES 的 REST 接口验证日志是否成功写入。
注意:8.x 默认 HTTPS 协议,访问时需要携带账号密码与 CA 证书。
-
查看索引是否创建成功
curl --cacert /opt/elasticsearch-8.15.0/config/certs/http_ca.crt
-u elastic:你的ES密码
https://localhost:9200/_cat/indices?v
如果列表中出现 nginx-access-log-日期 格式的索引,说明日志已经成功写入。
-
统计当日日志总条数
curl --cacert /opt/elasticsearch-8.15.0/config/certs/http_ca.crt
-u elastic:你的ES密码
-X GET "https://localhost:9200/nginx-access-log-*/_count"
-H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"@timestamp": {
"gte": "now-1d"
}
}
}
}
' -
查询前 10 条日志内容
curl --cacert /opt/elasticsearch-8.15.0/config/certs/http_ca.crt
-u elastic:你的ES密码
-X GET "https://localhost:9200/nginx-access-log-*/_search?size=10&pretty"
返回结果中可以看到 clientip、request、response、agent 等拆分后的字段,说明 Grok 解析成功。
6.3 Kibana 可视化查询
如果安装了 Kibana,进入界面后创建对应索引的数据视图(8.x 版本原索引模式已更名为数据视图),之后就可以:
-
通过关键字快速检索日志,支持多维度条件过滤
-
用仪表盘统计每日 PV、UV、热门接口、错误状态码占比
-
配置告警规则,异常日志实时通知运维人员
七、完整链路联调步骤
-
启动 Elasticsearch,确认 9200 端口正常,账号密码可正常登录
-
启动 Logstash,查看日志确认 5044 端口监听成功,无报错
-
启动业务服务器上的 Filebeat,查看日志确认已成功连接 Logstash
-
访问 Nginx 站点,产生新的访问日志
-
调用 ES 查询接口,确认日志成功写入且字段解析正确
-
在 Kibana 中创建数据视图,验证可视化查询能力
八、8.x 版本常见问题与排错方案
1. Logstash 连接 ES 报证书校验失败
-
原因:8.x ES 默认开启 HTTPS,未配置 CA 证书会导致握手失败
-
解决:在 elasticsearch 输出配置中添加
ssl_certificate_authorities指定 CA 证书路径;测试环境可临时添加ssl_verification_mode => "none"关闭校验,生产环境不推荐
2. Grok 解析失败,字段未拆分
-
原因:Nginx 日志格式与默认模板不匹配,自定义格式无法直接用 COMBINEDAPACHELOG
-
解决:复制一行真实日志,用在线 Grok Debugger 工具调试匹配表达式;生产环境推荐使用 Filebeat Nginx 模块替代手写 Grok
3. Filebeat 不采集新日志
-
检查日志文件路径是否正确,Filebeat 进程是否有读取日志文件的权限
-
检查 registry 文件是否损坏,停止 Filebeat 后删除 data/registry 目录重试
-
查看 filebeat 日志,确认是否有文件读取、连接失败的报错
4. 日志时间与北京时间差 8 小时
-
原因:Logstash 默认使用 UTC 时间存储
-
解决:在 filter 的 date 插件中指定
timezone => "Asia/Shanghai",将日志时间转换为东八区
5. Logstash 启动慢、内存占用高
-
原因:默认 JVM 堆内存配置为 1G,测试环境资源不足
-
解决:修改
config/jvm.options,调整-Xms和-Xmx参数,测试环境可设为 512m;生产环境根据日志量调整为 2-4G
6. 日志重复采集
-
常见于日志轮转、手动修改日志文件的场景
-
避免手动修改已采集过的日志文件;配置合理的日志轮转策略,确保轮转后的文件不被重复监听
九、生产环境扩展方向
本文演示的是基础入门架构,在生产环境中可以从以下方向做优化升级:
-
增加 Kafka 缓冲层:在 Filebeat 和 Logstash 之间加入 Kafka,应对流量洪峰,避免日志突增冲垮 Logstash,实现采集与处理解耦
-
标准化日志结构:业务日志优先打印 JSON 结构化日志,减少 Grok 解析成本,提升处理效率
-
性能优化:Logstash 配置多管道、调整批量写入大小、工作线程数;ES 集群部署,分片副本合理规划
-
高可用部署:Logstash 多节点部署,Filebeat 配置多地址负载均衡;ES 三节点起步集群,避免单点故障
-
日志生命周期管理:通过 ES ILM 索引生命周期管理,自动实现热温冷数据分层、过期日志自动删除,降低存储成本
-
安全加固:全链路开启 TLS 加密传输,配置最小权限账号,开启审计日志,满足等保合规要求