ELK中,Logstash不是必须安装的。html
Logstash是一个功能强大的工具,提供了大量的插件,用于解析、加工各类来自数据源的数据。若是Beat采集的数据,须要加工处理后才能使用,就须要将集成Logstash。java
要下载安装Logstash,打开一个命令行窗口,执行如下命令:linux
Logstash依赖Java 8 或 Java 11,确保已经安装了Java。shell
[root@qikegu ~]# java --version openjdk 11.0.3 2019-04-16 LTS OpenJDK Runtime Environment 18.9 (build 11.0.3+7-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7-LTS, mixed mode, sharing)
deb:app
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.1.0.deb sudo dpkg -i logstash-7.1.0.deb
rpm:curl
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.1.0.rpm sudo rpm -i logstash-7.1.0.rpm
mac and linux:elasticsearch
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.1.0.tar.gz tar -xzvf logstash-7.1.0.tar.gz
win:ide
C:\Program Files
。要了解有关安装、配置和运行Logstash的更多信息,请阅读官网文档。工具
Logstash提供了输入插件,用于接受数据输入。在本教程中,你将建立一个Logstash管道配置,用于侦听Beat输入,并将接收到的数据发送到Elasticsearch。学习
建立一个新的Logstash管道配置文件,命名为demo-metrics-pipeline.conf
。若是将Logstash安装为deb或rpm包,请在Logstash配置目录(例如:/etc/logstash/conf.d/
)中建立文件。
文件必须包含:
示例:
input { beats { port => 5044 } } # The filter part of this file is commented out to indicate that it # is optional. # filter { # # } output { elasticsearch { hosts => "localhost:9200" manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
使用此管道配置启动Logstash时,Beat事件都将经过Logstash发往elasticsearch,在Logstash中,能够使用Logstash的强大功能分析加工数据。
启动Logstash,若是将Logstash安装为deb或rpm包,请确保配置文件位于配置目录中。
deb:
sudo /etc/init.d/logstash start
rpm:
sudo service logstash start
mac and linux:
./bin/logstash -f demo-metrics-pipeline.conf
win:
./bin/logstash -f demo-metrics-pipeline.conf
Logstash开始监听Beat发送过来的事件。接下来,须要配置Metricbeat,将事件发送到Logstash。
默认状况下,Metricbeat将事件发送到Elasticsearch。
要将事件发送到Logstash,需修改配置文件metricbeat.yml
。能够在Metricbeat安装目录下找到这个文件,或者/etc/metricbeat
(rpm和deb)。
注释掉output.elasticsearch
部分,启用output.logstash
部分:
#-------------------------- Elasticsearch output ------------------------------ #output.elasticsearch: # Array of hosts to connect to. #hosts: ["localhost:9200"] ... #----------------------------- Logstash output -------------------------------- output.logstash: # The Logstash hosts hosts: ["localhost:5044"]
保存文件,从新启动Metricbeat,使配置更改生效。
目前,Logstash只是将事件转发给Elasticsearch,没有进行处理。接下来,将学习使用过滤器。
Metricbeat收集的系统数据,包括一个名为cmdline
的字段,该字段包含了进程启动的完整命令行参数。例如:
"cmdline": "/Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container -childID 3 -isForBrowser -boolPrefs 36:1|299:0| -stringPrefs 285:38;{b77ae304-9f53-a248-8bd4-a243dbf2cab1}| -schedulerPrefs 0001,2 -greomni /Applications/Firefox.app/Contents/Resources/omni.ja -appomni /Applications/Firefox.app/Contents/Resources/browser/omni.ja -appdir /Applications/Firefox.app/Contents/Resources/browser -profile /Users/dedemorton/Library/Application Support/Firefox/Profiles/mftvzeod.default-1468353066634 99468 gecko-crash-server-pipe.99468 org.mozilla.machname.1911848630 tab"
你可能只须要命令的路径,而不是将整个命令行参数发送给Elasticsearch。一种方法是使用Grok过滤器,学习Grok超出了本教程的范围,可是若是想了解更多,请参阅Grok filter插件文档。
要提取路径,在前面建立的Logstash配置文件中,在输入和输出部分之间,添加如下Grok过滤器:
filter { if [system][process] { if [system][process][cmdline] { grok { match => { "[system][process][cmdline]" => "^%{PATH:[system][process][cmdline_path]}" } remove_field => "[system][process][cmdline]" } } } }
cmdline_path
的字段中。cmdline
,所以在Elasticsearch中不为其创建索引。完成后,完整的配置文件应该以下所示:
input { beats { port => 5044 } } filter { if [system][process] { if [system][process][cmdline] { grok { match => { "[system][process][cmdline]" => "^%{PATH:[system][process][cmdline_path]}" } remove_field => "[system][process][cmdline]" } } } } output { elasticsearch { hosts => "localhost:9200" manage_template => false index => "qikegu-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
从新启动Logstash,使配置生效。该事件如今包含一个名为cmdline_path
的字段,包含命令的路径:
"cmdline_path": "/Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container"