前文我们聊解了什么是elk,elk中的elasticsearch集群相关组件和集群搭建以及es集群常用接口的说明和使用,回顾请查看考https://www.cnblogs.com/qiuhom-1874/p/13758006.html;今天我们来了解下ELK中的日志收集器logstash;
logstash的工作原理类似Linux里的rsyslog,首先logstash会有一个数据输入源,也就是logstash去哪里采集数据,它的采集数据来源很多,比如从文件中采集,从某个tcp/udp端口采集,从redis的消息队列中采集,kafka啊、标准输入等等;它和rsyslog不同的是,rsyslog是把日志数据从一个地方转到另一个地方,中间不会去处理日志的格式,采集回来是什么样就是什么样;而logstash不一样,logstash它可以把采集回来的日志做格式化,以不同的编码形式向外输出;比如把nginx的日志采集回来,它可以以json格式输出;同时它还可以处理采集回来的日志,比如忽略某些字段的输出,把原有日志格式做切分;把原来不是json格式的日志,通过输出规则转换为json格式的日志;总体流程图如下
提示:以上流程图主要表示logstash采集数据和处理数据内部的一个流程;从上面的流程不难想象,logstash就是把一个数据采集回来,通过内部定义的处理规则,然后通过output规则输出到指定地方的一个插件;
安装logstash
logstash的运行方式有两种,第一种以agint的方式运行在数据源所在服务器上采集数据,然后输出到指定地方;第二种是以server方式独立运行在一个服务器上,接受filebeat从数据源发送过来的数据,然后在输出到其他地方;logstash的运行以来jdk,所以首先要在运行jdk的服务器上安装jdk;logstash的版本最好同ELK中的其他组件版本一样;
安装jdk
yum install -y java-1.8.0-openjdk-devel
导出JAVA_HOME环境变量
下载logstash-6.8.12.rpm包
[root@node03 ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.12.rpm --2020-10-02 15:01:14-- https://artifacts.elastic.co/downloads/logstash/logstash-6.8.12.rpm Resolving artifacts.elastic.co (artifacts.elastic.co)... 151.101.230.222, 2a04:4e42:36::734 Connecting to artifacts.elastic.co (artifacts.elastic.co)|151.101.230.222|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 177059640 (169M) [application/octet-stream] Saving to: ‘logstash-6.8.12.rpm’ 100%[==========================================================================>] 177,059,640 136MB/s in 1.2s 2020-10-02 15:01:15 (136 MB/s) - ‘logstash-6.8.12.rpm’ saved [177059640/177059640] [root@node03 ~]#
安装logstash-6.8.12.rpm
[root@node03 ~]# ll total 172912 -rw-r--r-- 1 root root 177059640 Aug 18 19:41 logstash-6.8.12.rpm [root@node03 ~]# yum install ./logstash-6.8.12.rpm Loaded plugins: fastestmirror Examining ./logstash-6.8.12.rpm: 1:logstash-6.8.12-1.noarch Marking ./logstash-6.8.12.rpm to be installed Resolving Dependencies --> Running transaction check ---> Package logstash.noarch 1:6.8.12-1 will be installed --> Finished Dependency Resolution Dependencies Resolved =================================================================================================================================== Package Arch Version Repository Size =================================================================================================================================== Installing: logstash noarch 1:6.8.12-1 /logstash-6.8.12 294 M Transaction Summary =================================================================================================================================== Install 1 Package Total size: 294 M Installed size: 294 M Is this ok [y/d/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : 1:logstash-6.8.12-1.noarch 1/1 Using provided startup.options file: /etc/logstash/startup.options /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.31/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated Successfully created system startup script for Logstash Verifying : 1:logstash-6.8.12-1.noarch 1/1 Installed: logstash.noarch 1:6.8.12-1 Complete! [root@node03 ~]#
提示:logstash安装生成的文件超级多,其中主配置文件是/etc/logstash/lostash.yml,配置日志收集规则、过滤规则、输出规则的文件通常放在/etc/logstash/conf.d/目录下以.conf结尾的文件;其实主配置文件基本不用动,我们直接在/etc/logstash/conf.d/目录下编辑日志收集规则配置文件,然后启动logstash即可;
示例:编写配置文件,定义logstash从标准输入收集数据,输出到标准输出;
[root@node03 ~]# cat /etc/logstash/conf.d/stdin-stdout.conf input { stdin {} } output { stdout {} } [root@node03 ~]#
提示:logstash数据收集配置文件格式是input {} output{},其中input 用来定义数据源输入的配置,其中里面stdin {}表示使用标准输入插件采集数据;同样output用于定义数据输出的,stdout表示把input里定义的数据采集采集到的数据输出到output里定义的输出位置;以上配置就表示把标准输入采集到数据,输出到标准输出;
检查配置文件语法是否正确
提示:-f用于指定配置文件,-t表示检查指定配置文件的语法是否正确;configuration ok表示指定配置文件语法正确;
验证:启动logstash,在标准输入中输入数据,看看是否会把我们输入的数据输出到标准输出呢?
提示:可以看到当我们指定logstash以/etc/logstash/conf.d/stdin-stdout.conf配置文件启动,在标准输入中输入了hello world,它输出了一个json格式的信息,其中message字段就是我们输入的内容;它这个默认输出就是用的rubydebug的格式向外输出;当然我们可以在输出里用codec来指定输出以那种格式输出;
示例:指定输出格式用json格式输出
验证:启动logstash,看看输出是否是json格式呢?
提示:可以看到当我们在配置文件中指定输出编码是json格式以后,启动logstash看到logstash输出格式就是以json格式输出了;
示例:配置logstash从文件中采集数据,输出到标准输出,输出格式为rubydebug
提示:以上配置表示从/var/log/test.log中采集数据,开始采集位置上文件最开始处,类型为test.log,输出以rubydebug格式输出到标准输出;
验证:以/etc/logstash/conf.d/file-stdout.conf启动logstash,看看完test.log中追加内容,它是否会输出到标准输出呢?
提示:现在启动logstash,可以看到标准输出上没有输出内容,原因是我们指定的文件现在没有数据,所以它没有什么数据采集;
向/var/log/test.log中追加数据,看看在标准输出中是否会有对应的内容以我们在配置文件中指定的格式输出呢?
提示:可以看到我们在另外一个终端向/var/log/test.log中追加数据,在标准输出中可看到logstash把对应文件中的数据采集到,并输出到标准输出;
示例:收集httpd的日志到es集群中;
启动logstash,然后访问httpd,看看对应的es集群中是否有日志生成?
提示:启动logstash以后,可以看到对应打印的日志,已经将我们的配置读取并应用了;
访问httpd,然后到es上查看对应的日志信息是否有?
提示:可以看到在es集群中有对应的index生成,并且里面内容也是我们访问httpd的日志;从上面收集的日志来看,它是把日志内容当作message字段一个字段输出,通常这不是我们想要的结果,这样收集的日志,对我们来说没有太大的意义;我们需要让logstash帮我们处理,把日志内容切分成多个字段,然后再输出;
示例:配置logstash切分日志,然后保存到es集群
提示:logstash处理日志依赖filter插件,其中grok是filter的核心插件,它内置了很多正则表达式,对常用的的日志做精准匹配;以上filter插件主要做了两件事,第一把message字段通过内部的HTTPD_COMBINDLOG做了字段切分;第二件事,把原有的message字段删除,避免同一数据多次收集;
验证:检查配置文件语法,然后启动logstash
启动logstash
清空原有访问日志,然后访问httpd
在es上查看收集的日志
提示:可以看到在es上收集到的日志,就把message字段拆分成不同的字段的json格式了;