Logstash
Logstash
什么是Logstash?
Logstash 是一种开源的数据收集引擎,具备实时流水线处理能力,它能够动态整合来自不同来源的数据,并将这些数据规范化处理,然后将其发送到指定的目的地,通过这种方式,可以清理所有数据,使其易于处理,从而满足各种高级分析和可视化的需求。
可以通过运行最基础的 Logstash 管道测试来确认 Logstash 安装是否正常工作,Logstash 的管道处理流程包含两个必需的元素,即 input 和 output ,还有一个可选的元素 filter 。
输入插件负责从数据源获取数据,过滤器插件则根据指定的规则对数据进行处理,而输出插件则负责将处理后的数据写入目标位置。

安装Logstash,并测试是否可以正常使用(实验使用的环境是centos7.9,logstash使用的是7.17.26)
- 下载logstash,下载链接:Past Releases of Elastic Stack Software | Elastic

通过复制dowload的链接,用yum工具进行安装logstash
[root@logstash ~]# yum -y install https://www.elastic.co/downloads/past-releases/logstash-7-17-26
给logstash命令设置软连接到/usr/local/bin下面,以便以后在任何地方都可以使用logstash
[root@logstash ~]# ln -svf /usr/share/logstash/bin/logstash /usr/local/bin/
使用"logstash --help"可以查看logstash的使用方法 -
测试logstash是否可以正常使用
启动一个最简单的 Logstash 调试管道,从终端标准输入读取每一行数据,把它包装成 Logstash 事件,然后以 RubyDebug 格式打印到终端标准输出。
[root@logstash ~]# logstash -e "input { stdin { type => stdin } } output { stdout { codec => rubydebug } } " Using bundled JDK: /usr/share/logstash/jdk ………… The stdin plugin is now waiting for input: [INFO ] 2026-09-17 09:50:16.654 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} 11111 { "type" => "stdin", "@version" => "1", "message" => "11111", "@timestamp" => 2026-09-17T01:50:29.650Z, "host" => "logstash" }从上结果可以看出,从终端的标准输入输入数据,可以以指定的格式打印到终端上,表示logstash可以正常工作。
基于配置文件的方式启动logstash
案例1:从终端标准输入读取每一行数据,把它包装成 Logstash 事件,然后以 RubyDebug 格式打印到终端标准输出。
- 在/etc/logstash/conf.d/下写配置文件
[root@logstash ~]# cd /etc/logstash/conf.d/ [root@logstash /etc/logstash/conf.d]# vim 01-stdin-to-stdout.conf [root@logstash /etc/logstash/conf.d]# cat 01-stdin-to-stdout.conf # 表示数据从哪里来 input { # 表示从标准输入来 stdin { type => stdin } } # 表示数据到哪里去 output { # 表示从标准输出去 stdout { codec => rubydebug # codec => json } }
- 基于配置文件启动 Logstash
-f, --path.config CONFIG_PATH Load the logstash config from a specific file [root@logstash /etc/logstash/conf.d]# logstash -f 01-stdin-to-stdout.conf Using bundled JDK: /usr/share/logstash/jdk ………… The stdin plugin is now waiting for input: [INFO ] 2026-09-17 10:02:17.759 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} 1111 { "type" => "stdin", "message" => "1111", "@timestamp" => 2026-09-17T02:02:20.047Z, "host" => "logstash", "@version" => "1" }
案例2:logstash采集文本日志案例
- 在/etc/logstash/conf.d/下写配置文件
[root@logstash /etc/logstash/conf.d]# cat 02-file-to-stdout.conf input { file { # 首次采集文件时从哪开始读取数据 start_position => "beginning" # 指定文件的路径 path => ["/tmp/xushiqiang.log","/tmp/yangyaqi.log"] } } output { stdout {} } [root@logstash /etc/logstash/conf.d]#
- 在指定的文件路径中,加入测试数据
[root@logstash /etc/logstash/conf.d]# echo "xushiqiang" >> /tmp/xushiqiang.log [root@logstash /etc/logstash/conf.d]# echo "yangyaqi" >> /tmp/yangyaqi.log
- 启动 Logstash[root@logstash /etc/logstash/conf.d]# logstash -f /etc/logstash/conf.d/02-file-to-stdout.conf
Using bundled JDK: /usr/share/logstash/jdk ………… [WARN ] 2026-09-17 10:17:57.101 [[main]<file] plain - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. { "@version" => "1", "host" => "logstash", "path" => "/tmp/xushiqiang.log", "message" => "xushiqiang", "@timestamp" => 2026-09-17T02:17:57.062Z } { "@version" => "1", "host" => "logstash", "path" => "/tmp/yangyaqi.log", "message" => "yangyaqi", "@timestamp" => 2026-09-17T02:17:57.103Z }
终止上面的 Logstash 实例,重新基于这个配置文件启动一个实例,发现采集不到数据,这是因为上次采集到的数据已经保存到了 /usr/share/logstash/data/下了,不会重复采集,如果重新采集,
就要先删除该目录下面的数据[root@logstash /etc/logstash/conf.d]# logstash -f /etc/logstash/conf.d/02-file-to-stdout.conf
Using bundled JDK: /usr/share/logstash/jdk
…………
[INFO ] 2026-09-17 10:29:48.258 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} - 数据的保存位置在 /usr/share/logstash/data/
[root@logstash /etc/logstash/conf.d]# ll /usr/share/logstash/data/ total 4 drwxr-xr-x 2 root root 6 Sep 17 09:22 dead_letter_queue drwxr-xr-x 3 root root 20 Sep 17 10:17 plugins drwxr-xr-x 2 root root 6 Sep 17 09:22 queue -rw-r--r-- 1 root root 36 Sep 17 09:22 uuid
各个文件的介绍如下:ead_letter_queue/:死信队列(Dead Letter Queue, DLQ)目录。-
作用:当 Logstash 处理事件时,如果某个事件在 filter 或 output 阶段发生错误,如果启用了 DLQ,Logstash 不会直接丢弃这个事件,而是将它写入这个目录保存起来。
-
默认状态:Logstash 默认不启用 DLQ,所以这个目录通常是空的。
plugins/:插件相关数据目录。-
作用:存放 Logstash 插件运行时的元数据、缓存、依赖信息等。
queue/:持久化队列(Persistent Queue)目录。-
作用:当 Logstash 启用持久化队列时,输入插件收到但尚未被 output 处理完的事件会先写入磁盘,防止 Logstash 崩溃或重启时丢失数据。
-
默认状态:Logstash 默认使用内存队列,不启用持久化队列,所以这个目录通常为空。
uuid:Logstash 实例的唯一标识文件。-
作用:保存当前 Logstash 实例的 UUID(通用唯一识别码)。每次启动时,Logstash 会读取这个文件;如果不存在,则生成一个新的 UUID 并写入。
-
用途:用于在集群或监控中区分不同的 Logstash 实例,不要随意删除,否则重启后会生成新的 UUID,可能导致监控数据断裂。
因为启动logstash时,会将本次的数据信息保存到该目录下,因此当终止此次的 Logstash 任务后,下次再使用该配置文件启动一个 Logstash 不会重新采集上次采集过的数据,如果想要重新采集数据,需要删除该目录下的文件,然后重新启动 Logstash 实例。
-
案例3:ELFK架构案例filebeat对接Logstash实战
案例梳理:
1、filebeat 采集 nginx 访问日志数据,输出到 logstash
2、logstash 接收 filebeat 输出的数据,然后写入到ES集群中
3、在 kibana 进行数据的展示
本次实验的服务器机器如下:
ES集群:
http.port: 9200
cluster.initial_master_nodes: ["10.0.0.141", "10.0.0.142","10.0.0.143"]
filebeat:10.0.0.144
logstash:10.0.0.142
kibana:10.0.0.143(端口5601)
- 在 logstash 上写配置文件,并启动 logstash 实例
[root@logstash /etc/logstash/conf.d]# cat 03-beats-to-es.conf
input {
beats {
port => 5044
}
}output {
elasticsearch {
hosts => ["10.0.0.141:9200", "10.0.0.142:9200","10.0.0.143:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
}[root@logstash /etc/logstash/conf.d]# logstash -f 03-beats-to-es.conf
Using bundled JDK: /usr/share/logstash/jdk
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
……………………
[INFO ] 2026-09-17 10:59:08.341 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2026-09-17 10:59:08.469 [[main]<beats] Server - Starting server on port: 5044 - 在 filebeat 上写配置文件,并启动 filebeat 实例
[root@filebeat /etc/filebeat/config]# cat 13-filebeat-nginx-to-logstash.yaml filebeat.inputs: - type: filestream id: nginx-access enabled: true paths: - /var/log/nginx/access.log* output.logstash: hosts: ["10.0.0.142:5044"] [root@filebeat /etc/filebeat/config]# filebeat -e -c /etc/filebeat/config/13-filebeat-nginx-to-logstash.yaml 2026-09-17T11:00:46.844+0800 INFO instance/beat.go:698 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat] Hostfs Path: [/] 2026-09-17T11:00:46.844+0800 INFO instance/beat.go:706 Beat ID: b3012926-27e3-45a9-81b0-34fea1561ff8 ………… 2026-09-17T11:00:47.859+0800 INFO [publisher] pipeline/retry.go:223 done 2026-09-17T11:00:47.865+0800 INFO [publisher_pipeline_output] pipeline/output.go:151 Connection to backoff(async(tcp://10.0.0.142:5044)) established
- 进入 kibana 的网页(http://10.0.0.143:5601),建立索引模式,查看数据



由上可以发现,数据已经成功从 logstash 写入到了 ES 集群。
浙公网安备 33010602011771号