【ELK】-4 logstash的搭建及操作 文章目录Logstash 搭建与实战一、ELK 架构与数据流向1. 组件分工2. 三种架构形态3. Logstash 内部三阶段面试高频4. 一句话理解整条流5. 面试常问对比二、Logstash 部署1. 安装 JDK可跳过2. 安装 Logstash3. 配置 JVM 堆内存4. 测试 Logstash三、Logstash 配置文件1. 配置结构2. 案例采集系统日志 syslog 输出到 ES四、实战学习版Logstash 直读 Nginx 日志步骤 1编写 Logstash 配置文件步骤 2检查权限非常容易踩坑步骤 3启动 Logstash 加载配置步骤 4验证 ES 是否收到数据五、生产实践Filebeat 采集 Nginx 日志 → Logstash → ES1. 生产链路图2. 安装 Filebeat3. 配置 filebeat.yml4. 权限处理必做否则读不到日志5. 启动与开机自启6. Logstash 端配置独立 Logstash 服务器7. 语法检查与运行方式六、高频坑点总结七、面试小问答Logstash 搭建与实战Logstash 是 ELK 栈中的数据处理管道负责日志的采集、清洗与输出。本文从 ELK 整体架构讲起涵盖 Logstash 部署、配置文件编写、Nginx 日志采集实战以及生产环境 Filebeat Logstash 的完整落地rpm / apt 两种安装方式。一、ELK 架构与数据流向ELK Elasticsearch Logstash Kibana官方整套栈现在叫Elastic Stack通常还会加入Filebeat轻量采集器生产环境必用。1. 组件分工组件角色Filebeat部署在业务服务器采集日志文件轻量占用资源很小Logstash数据处理管道过滤、清洗、转换、解析日志CPU 消耗更高Elasticsearch存储、索引日志数据提供搜索查询能力核心存储Kibana可视化 Web 界面查日志、画图、做仪表盘2. 三种架构形态① 最简单架构学习测试数据源 → Logstash → Elasticsearch ← Kibana数据源标准输入 stdin、文件、TCP 端口等Logstash 采用input → filter → output三段式处理缺点生产不能这么玩——Logstash 直接部署在业务机太重没有缓冲日志量大容易丢② 生产标准架构Filebeat 版企业最常用业务服务器日志文件 → Filebeat → Logstash → Elasticsearch ← Kibana完整数据流向采集Filebeat— 部署在业务机器上监听磁盘日志文件nginx、java 应用日志等读取新增日志行并发送给 Logstash。自带重试、断点续传机器重启不会从头重读日志。处理Logstash— 三阶段流水线input接收 Filebeat 发来的原始日志filter最重要日志清洗切割字段、时间格式化、过滤无效日志、IP 解析、去除无用内容output把处理干净的结构化数据发送给 Elasticsearch存储索引Elasticsearch— 接收 Logstash 推送的数据自动建立索引分片存储对外提供搜索 API可视化查询Kibana— 只读 ES不碰原始日志做日志检索、告警、报表图表③ 高可用架构大规模加消息队列缓冲当日志流量暴涨为防止 Logstash/ES 扛不住丢数据中间加入消息队列Kafka业务日志 → Filebeat → Kafka 消息队列 → Logstash 消费 Kafka → Elasticsearch ← KibanaFilebeat 把日志发给 Kafka队列缓存峰值流量Logstash 从 Kafka 消费、慢慢处理即使 ES 短暂故障日志在 Kafka 里也不会丢失3. Logstash 内部三阶段面试高频input{}# 数据从哪里来file/beats/stdin/tcpfilter{}# 数据清洗转换可空测试环境经常省略output{}# 数据输出去哪里elasticsearch/stdout如果执行命令时没有写 filter就是原始数据直接输出 ES。4. 一句话理解整条流Filebeat 去各个机器捡日志交给 Logstash洗日志拆字段洗好存进 Elasticsearch 数据库最后 Kibana 给人看界面查日志。5. 面试常问对比Filebeat vs Logstash对比项FilebeatLogstash定位轻量采集器只采集、不做复杂处理专注数据清洗转换语言 / 资源Go 编写占用极小JRuby吃内存 CPU部署位置业务服务器独立服务器为什么生产不用 Logstash 直接读日志文件Logstash 耗资源部署在业务服务器会抢占业务程序 CPU 内存所以用 Filebeat 分布式采集。二、Logstash 部署Logstash 一般部署在需要收集日志的服务器。在本案例中Logstash 部署在Web 节点上用于收集日志并发送到 Elasticsearch。1. 安装 JDK可跳过Logstash 7.x 之前的版本都需要安装 JDK7.x 之后版本内置了 JDK 环境可以不装也可以自行安装。2. 安装 Logstash# 上传、解压tar-zxvflogstash-7.17.27-linux-x86_64.tar.gz-C/usr/local/cd/usr/local/mvlogstash-7.17.27 logstash# 创建软链接方便全局使用 logstash 命令ln-s/usr/local/logstash/bin/logstash /usr/local/bin/3. 配置 JVM 堆内存vim/usr/local/logstash/config/jvm.options-Xms2g -Xmx2g4. 测试 Logstash常用命令选项选项说明-f指定 Logstash 配置文件按文件配置输入和输出流-e从命令行获取配置若为空默认 stdin 作为输入、stdout 作为输出-t测试配置文件语法是否正确只校验、不启动服务返回Configuration OK-w指定 filter 线程数量默认 5-l指定日志文件名称✅ 最佳实践修改完配置文件必须先执行-t语法检查再启动服务。标准输入 → 标准输出# 输入采用标准输入输出采用标准输出类似管道新版本默认使用 rubydebug 格式输出logstash-einput { stdin{} } output { stdout{} }logstash-einput { stdin{} } output { stdout{ codecrubydebug } }运行后键入内容终端输出www.baidu.com # 键入内容标准输入{timestamp2020-12-22T02:15:39.136Z,# 输出结果标准输出处理后的结果version1,hostweb1,messagewww.baidu.com}标准输入 → Elasticsearchlogstash-einput { stdin{} } output { elasticsearch { hosts[192.168.80.20:9200] } }www.baidu.com # 键入内容标准输入 www.sina.com.cn # 键入内容标准输入 www.google.com # 键入内容标准输入结果不在标准输出显示而是发送至 Elasticsearch。可浏览器访问http://192.168.80.10:9100/Elasticsearch Heads 插件查看索引信息和数据浏览。三、Logstash 配置文件Logstash 配置文件基本由三部分组成input、output以及可选的filter根据需要选择使用。1. 配置结构input { ... } # 数据从哪里来采集数据Kafka、日志文件等 filter { ... } # 数据处理层格式化、类型转换、数据过滤支持正则 output { ... } # 数据输出去哪里处理后的数据送往何处常用插件部分插件说明inputfile / beats / kafka / redis / stdin常见数据源filtergrok把若干大文本字段再分割成小字段(?字段名正则表达式)filterdate对数据中的时间格式进行统一和格式化filtermutate重命名、删除、替换和修改事件字段剔除无用字段、增加自定义字段filtermultiline对多行数据进行统一编排将多行数据汇总为单一一行outputelasticsearch / stdout输出目标参考资料https://blog.csdn.net/weixin_42073629/article/details/110154037配置文件内容格式input { ... } filter { ... } output { ... }多数据源示例每个部分中也可以指定多个访问方式。例如指定两个日志来源文件input { file { path /var/log/syslog type system_log } file { path /var/log/auth.log type auth_log } }2. 案例采集系统日志 syslog 输出到 ESchmodr /var/log/syslog# 让 Logstash 可以读取日志mkdir/usr/local/logstash/conf.d/cd/usr/local/logstash/conf.d/vimsyslog.confsyslog.conf内容input { file { path /var/log/syslog type system_log_192.168.80.13 start_position beginning #ignore_older 86400 sincedb_path /usr/local/logstash/sincedb_path/log_progress } } output { elasticsearch { # 输出到 elasticsearch hosts [192.168.80.10:9200,192.168.80.11:9200,192.168.80.12] # 指定 elasticsearch 服务器的地址和端口 index system_log_192.168.80.13-%{yyyy.MM.dd} # 指定输出到 elasticsearch 的索引格式 } }file 插件常用参数参数说明path要收集的日志文件位置必须使用绝对路径可使用通配符匹配同时指定多个文件用,间隔exclude排除不想监听的文件type指定 Event 的 type 字段若输入 ES 时未指定 document_type此处 type 将作为 ES 中 index 的 typestart_positionbeginning表示从头开始读取end表示读取最新的默认该选项只在第一次启动时有效需与ignore_older一起使用ignore_older针对多久以内修改过的文件进行监控默认一天单位秒sincedb_pathsincedb 文件路径保存每个日志文件已被读取到的位置Logstash 重启后从上次位置继续读取。想重新从头读取需删除 sincedb 文件设为/dev/null即不保存位置信息必须指定文件而不是目录sincedb_write_interval设置多久写入一次读取位置信息单位秒delimiter文件内容的行分隔符默认按\n进行 Event 封装启动前准备 sincedb 文件并运行mkdir/usr/local/logstash/sincedb_pathtouch/usr/local/logstash/sincedb_path/log_progress logstash-fsyslog.conf完成后可用谷歌浏览器的Elasticsearch Heads插件查看索引信息。四、实战学习版Logstash 直读 Nginx 日志架构Nginx日志文件 → Logstash(input读取文件) → filter解析nginx日志 → output输出ES⚠️ 生产环境不推荐 Logstash 直接读日志优先 Filebeat这里演示 Logstash 直接读取文件的方式适合学习。Nginx 日志分两种默认 access 普通日志、error 错误日志。日志路径一般在/var/log/nginx/access.log、/var/log/nginx/error.log。步骤 1编写 Logstash 配置文件新建配置文件如nginx_log.conf放在 logstash 的config/目录# input 输入读取 nginx 访问日志 input { file { path /var/log/nginx/access.log # nginx 访问日志路径 start_position beginning # 第一次运行从文件开头读后续默认记住偏移量不会重复读 sincedb_path /dev/null # 关闭记录读取偏移量的文件测试用生产去掉这个配置 } } # filter 过滤【重点解析 nginx 日志把一整行字符串拆成字段】 filter { # 使用 grok 插件切割 nginx 访问日志 grok { match { message %{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] %{WORD:method} %{URIPATH:request_uri}(?:\?%{URIPARAM:query})? HTTP/%{NUMBER:http_version} %{NUMBER:response_code:int} %{NUMBER:bytes:int} %{DATA:referer} %{DATA:user_agent} } } # 把日志里的时间字符串转为 ES 识别的 timestamp 时间字段 date { match [ timestamp , dd/MMM/yyyy:HH:mm:ss Z ] } } # output 输出写入 ES output { elasticsearch { hosts [192.168.80.10:9200] # 你的 ES 地址 index nginx-access-%{YYYY.MM.dd} # 按天生成索引 } # stdout { codec rubydebug } # 打开可终端打印解析后的日志调试用生产注释 }注意上面 grok 模式适配Nginx 默认的 combined 日志格式。如果你的 nginx 改过log_formatgrok 表达式要跟着改否则解析失败。步骤 2检查权限非常容易踩坑logstash 运行用户一般是logstash这个用户读不到/var/log/nginx日志# 方案 1给日志读权限 chmod 644 /var/log/nginx/*.log # 方案 2把 logstash 用户加入 nginx 组 usermod -aG nginx logstash步骤 3启动 Logstash 加载配置# -f 指定配置文件路径 /usr/share/logstash/bin/logstash -f /etc/logstash/config/nginx_log.conf打开调试输出stdout { codec rubydebug }启动后终端会打印解析好的结构化日志用来验证 grok 是否解析成功。步骤 4验证 ES 是否收到数据# 查看当天生成的 nginx 索引 curl -XGET 192.168.80.10:9200/_cat/indices?v | grep nginx-access # 查询数据 curl 192.168.80.10:9200/nginx-access-2026.08.16/_search?q*Kibana 里创建索引模式填入nginx-access-*即可可视化查看 nginx 访问日志。五、生产实践Filebeat 采集 Nginx 日志 → Logstash → ESLogstash 很重不适合部署在 Nginx 机器上读磁盘文件正确做法Nginx 服务器部署 Filebeat 读取日志文件发送给 LogstashLogstash 只做 filter 清洗输出 ES。1. 生产链路图Nginx 机器 nginx 日志文件(/var/log/nginx/*.log) → Filebeat(读取本地日志) → 主动连接 → Logstash 服务器:5044 Logstash 服务器 5044 端口 beats input 接收数据 → filter(grok 解析清洗) → output 输出到 ES(9200) ES ← Kibana 做查询展示2. 安装 Filebeat版本要求Filebeat、Logstash、Elasticsearch 大版本号尽量保持一致避免版本兼容问题例如全部用 8.x。方式一rpm 安装CentOS 7/8# 下载 rpm 包版本尽量和 ES、Logstash 大版本保持一致rpm-ivhfilebeat-8.11.0-x86_64.rpm方式二apt 安装Debian / Ubuntu# 步骤 1安装依赖导入 Elastic GPG 密钥aptupdateaptinstall-yapt-transport-https ca-certificatescurlgnupgcurl-fsSLhttps://artifacts.elastic.co/GPG-KEY-elasticsearch|gpg--dearmor-o/usr/share/keyrings/elastic.gpg# 步骤 2添加 elastic apt 源想装 7.x 就把 packages/8.x 改成 packages/7.xechodeb [signed-by/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main|tee/etc/apt/sources.list.d/elastic-8.x.list# 步骤 3更新并安装aptupdateaptinstall-yfilebeatapt 注意点源里默认安装最新 8.x需要指定版本可用apt install filebeat8.11.0锁定版本。安装完默认是关闭的不会自动采集任何日志必须修改filebeat.yml并启动。安装路径对照表项目CentOSrpmUbuntuapt主配置文件/etc/filebeat/filebeat.yml/etc/filebeat/filebeat.yml模块配置目录—/etc/filebeat/modules.d/服务管理systemctl管理systemd托管日志查看journalctl -u filebeat -f/var/log/filebeat/也可 journalctl3. 配置 filebeat.yml⚠️ yml 严格注意缩进只能空格不能用 tab否则无法启动。# 输入源采集 nginx 日志 filebeat.inputs:-type:filestreamenabled:truepaths:-/var/log/nginx/access.log# nginx 访问日志-/var/log/nginx/error.log# nginx 错误日志# 输出发给远程 Logstash不要直接输出 ES output.logstash:hosts:[192.168.80.10:5044]# Logstash 机器 IP:5044 端口# 注释掉默认的 output.elasticsearch避免 filebeat 直连 ES#output.elasticsearch:# hosts: [http://localhost:9200]4. 权限处理必做否则读不到日志filebeat 服务运行用户是filebeat读不到/var/log/nginx的日志# 把 filebeat 用户加入 nginx 组usermod-aGnginx filebeat# 日志文件保证组可读chmodgr /var/log/nginx/*.log5. 启动与开机自启systemctl daemon-reload systemctl start filebeat systemctlenablefilebeat systemctl status filebeat# 实时看 filebeat 日志排错journalctl-ufilebeat-f排错如果日志采集不到优先看journalctl -u filebeat -f。常见报错权限不足、连不上 Logstash 的 5044 端口防火墙拦截。防火墙Nginx 机器Filebeat主动向外发起连接不需要开放本机端口只需允许出站访问 Logstash 服务器 5044 端口。Logstash 机器需要放行5044 端口接收 Filebeat 数据例如ufw allow 5044。6. Logstash 端配置独立 Logstash 服务器新建配置文件例如/etc/logstash/conf.d/nginx-pipeline.confLogstash 会读取conf.d/目录下所有.conf后缀的配置文件。# input 接收 filebeat端口固定 5044input{beats{port5044}}filter{# 解析 access 日志 grokerror 日志可以另外处理grok{match{message%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] %{WORD:method} %{URIPATH:request_uri}(?:\?%{URIPARAM:query})? HTTP/%{NUMBER:http_version} %{NUMBER:response_code:int} %{NUMBER:bytes:int} %{DATA:referer} %{DATA:user_agent}}}date{match[timestamp,dd/MMM/yyyy:HH:mm:ss Z]}}output{elasticsearch{hosts[192.168.80.10:9200]indexnginx-access-%{YYYY.MM.dd}}# stdout { codec rubydebug } # 调试打开打印解析后数据生产注释}7. 语法检查与运行方式Logstash# 语法检查 -t只校验配置语法不会真正启动服务返回 Configuration OK 即通过/usr/share/logstash/bin/logstash-f/etc/logstash/conf.d/nginx-pipeline.conf-t# 前台调试运行终端打印日志CtrlC 停止/usr/share/logstash/bin/logstash-f/etc/logstash/conf.d/nginx-pipeline.conf# 生产后台运行systemd 方式systemctl start logstash systemctlenablelogstash systemctl status logstashFilebeat没有-t用test config校验filebeattestconfig# 输出 Config OK 代表配置文件语法没问题六、高频坑点总结yaml 缩进filebeat.yml 是 yaml 格式缩进错误直接无法启动不要用 tab。日志权限filebeat / logstash 用户读不到 nginx 日志无数据输出——加入 nginx 组并chmod gr。防火墙 5044Logstash 机器未放行 5044 端口filebeat 连接失败ufw allow 5044。配置校验修改 Logstash 配置后一定要先-t语法校验再重启服务filebeat 用filebeat test config。grok 解析失败ES 文档出现_grokparsefailure标签代表日志格式和 grok 模板不匹配。sincedb_path测试设置/dev/null每次启动从头读文件生产一定要删掉否则会重复消费全部日志。Nginx 日志轮转日志切割后 filebeat 自动处理logstash file 输入也支持但不如 filebeat 稳定。索引命名不能大写不能以下划线开头。七、面试小问答Q为什么不用 Logstash 直接读业务机器的日志ALogstash 基于 JVM占用内存 CPU 高如果部署在业务服务器会抢占业务资源Filebeat 轻量级 Go 开发专门做采集只负责把日志推送出去业务服务器只部署 Filebeat。小面试点rpm vs aptCentOS(RPM) 用yum/rpmUbuntu(Debian) 用apt/deb。两者安装完配置逻辑完全一致只是安装方式和包管理器不一样。