在前面我们讲解了Elasticsearch的Kibana插件,对于我们实际使用来说可能Kibana并不会使用到,但是Logstash插件大部分的情况下都会使用,那Logstash到底是啥?今天我们就来介绍一下。
官方介绍说Logstash是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(我们的存储库当然是 Elasticsearch。)
通过200多个插件,Logstash可以接受几乎各种各样的数据。包括日志、网络请求、关系型数据库、传感器或物联网等等。
简单点来说就是Logstash是采集数据的工具,它可以从数据库、文件、MQ等中获取数据,然后放入到我们的搜索引擎(Elasticsearch)当中,供我们快速查询到需要的数据。
注意:Logstash安装需要Java8或Java11版本。
Logstash的安装也支持多种方式:
下载二进制文件安装,这里是最新版本下载,如果要选择过去的版本,历史版本。
直接下载二进制文件,解压后进入bin目录运行即可。
在Linux环境中,我们可以通过包管理进行安装,例如Unbuntu中的apt、以及CentOS中的yum。
安装公共签名key
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
添加依赖
echo "deb https://artifacts.elastic.co/packages/7.0/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.0.list
安装Logstash
sudo apt-get update && sudo apt-get install logstash
安装公共签名key
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在/etc/yum.repos.d/目录下,新建文件logstash.repo,内容如下:
[logstash-7.0]
name=Elastic repository for 7.0 packages
baseurl=https://artifacts.elastic.co/packages/7.0/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装Logstash
sudo yum install logstash
注意:Logstash最好也是不用root用户安装、启用。
我们知道Logstash是基于管道流的,所有它需要两个必须元素input和output,还有一个可选的filter。输入input插件可以自定义获取数据源,过滤filter插件可以自定义修改数据,输出output插件可以让自定义写入数据到目的地。
进入Logstash目录,执行测试命令,如下:
bin/logstash -e 'input { stdin { } } output { stdout {} }'
这里我们通过设置-e参数来运行Logstash,-e参数表示允许Logstash直接通过命令行接受配置。能够让我们快速测试看是否有错误。
当出现“Pipeline main started”字样后,我们输入hello world,可以看到如下的输出信息。
按住CTRL-D可以结束Logstash进程。
在前面我们大致熟悉了一下Logstash的基本流程,那么Logstash到底是如果工作的呢?我们来分析一下。
Logstash事件处理管道有三个阶段:输入→过滤器→输出。输入生成事件,过滤器修改它们,输出将它们发送到其他地方。输入和输出支持编解码器,能够在数据进入或退出管道时对数据进行编码或解码,而无需使用单独的过滤器。
使用输入将数据导入到Logstsh。常用的包括:
还可以从其他系统获取数据,更多支持可以查看输入插件列表。
过滤器是Logstash管道中的中间处理设备。可以将过滤器与条件组合,以便在事件满足特定条件时对其执行操作。一些有用的过滤包括:
更多支持,查看过滤插件列表。
输出是Logstash管道的最后阶段。事件可以通过多个输出,但是一旦所有输出处理完成,事件就完成了它的执行。一些常用的输出包括:
更多支持,查看输出插件列表。
编解码器基本上是流过滤器,可以作为输入或输出的一部分。使用编解码器可以轻松地将消息传输与序列化过程分开。流行的编解码器包括json,msgpack和plain (文本)。
更多支持,查看编解码插件列表。
我们创建一个logstash-simple.conf文件,内容如下:
input { stdin { } }
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
这里的意思是,我们将输入的信息输出到elasticsearch中显示,同时也输出到控制台中显示。即这里我们使用了多重输出。
接着我们输入命令:
bin/logstash -f logstash-simple.conf
-f为指定配置文件,logstash-simple.conf为配置文件加上具体路径即可。
运行完毕后,我们在命令端输出hello anumbrella
内容,可以查看到终端内容显示出来了。
同时elasticsearch-head中我们可以查看到先前输入的数据。
这里便完成了Logstash获取数据,然后存储到Elasticsearch中的基本操作。
接着我们再新建一个logstash-filter.conf文件,如下:
input { stdin { } }
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
这里我们添加了filter进行过滤匹配。
同理运行Logstash:
bin/logstash -f logstash-filter.conf
待启动完毕后,我们在终端输入下面的信息:
127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"
结果如下:
在这里Logstash(使用了grok过滤器)能够将一行的日志数据(Apache的"combined log"格式)分割设置为不同的数据字段。这一点对于日后解析和查询我们自己的日志数据非常有用。更多详细配置可以查看Logstash grok patterns。
前面的实例我们都是从命令端输入然后输出数据,这里我们再新建一个logstash-apache.conf内容如下,主要是配置了从文件中读取日志信息。
input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}
接着我们在/tmp目录下新建access_log文件,添加内容如下:
71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
再次运行启动Logstash,
bin/logstash -f logstash-apache.conf
我们可以查看到apache的日志数据已经导入到ES中了,在终端也输出了相应内容。这里Logstash会按照你的配置读取,处理指定的文件,任何后添加到文件的内容也会被捕获处理最后保存到ES中。此外,数据中type的字段值会被替换成"apache_access"(这个功能在配置中已经指定)。
除此之外,我们还可以配置正则匹配所有文件,比如:
input {
file {
path => "/tmp/*_log"
...
这里我们可以监控error日志和access日志等不同类型的日志信息。
我们可以在过滤器里面通过条件判断来处理不同的输出文件,比如我们更改上面logstash-apache.conf文件如下:
input {
file {
path => "/tmp/*_log"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { type => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
} else if [path] =~ "error" {
mutate { replace => { type => "apache_error" } }
} else {
mutate { replace => { type => "random_logs" } }
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
该type字段标记所有事件,但实际上并不解析error或random文件。有很多类型的错误日志,应该如何标记,这个实际上取决于我们正在使用的日志。
我们还可以监控端口,比如Syslog日志。
Syslog是Logstash最常见的用例之一,它处理得非常好(只要日志行大致符合RFC3164)。Syslog是事实上的UNIX联网日志记录标准,它将消息从客户端计算机发送到本地文件,或通过rsyslog发送到集中式日志服务器。
还是一样的,这里我们新建logstash-syslog.conf文件,内容如下:
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
这里我们监控了TCP 和UDP协议上端口5000的系统日志信息作为Logstash的输入来源。
执行logstash:
bin/logstash -f logstash-syslog.conf
通常,客户端计算机将连接到端口5000上的Logstash实例并发送其消息。对于这个例子,我们只是telnet到Logstash并输入一个日志行(类似于我们之前在STDIN中输入日志行的方式)。打开另一个命令窗口以与Logstash syslog输入交互并输入以下命令:
telnet localhost 5000
接着在命令窗口输入下面日志信息,模拟交互过程。
Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
我们在终端可以查看到相关信息输出:
到此Logstash的基本使用到此结束,当然还有更多用法,会在后面的文章再进行介绍。