Getting Started with Logstach 2

Parsing Logs with Logstash

之前,我们已经通过一个最基础的Logstash pipeline,验证了我们的Logstash环境已经准备就绪。在现实世界里,那样基础的pipeline没有什么存在的价值,我们需要更加复杂的pipeline:一般都会包含多个input、filter以及output插件。
在这个章节,我们会创建一个Logstash pipeline,使用Filebeat读取Apache的日志作为输入,并对日志进行解析、创建指定的命名字段信息,再将解析过的数据写入到Elasticsearch。这次不在命令行中配置pipeline,咱使用配置文件。
开始之前,下载sample数据,在接下来会用。

配置Filebeat,将日志信息发送给Logstash

开始创建Logstash pipeline前,得先配置Filebeat,负责将日志中的文本行发送给Logstash。Filebeat用来搜集服务器上的文件,并转发给Logstash示例进行处理。Filebeat具备可靠、低延迟的设计特性
默认的Logstash安装会包含Beats input插件。这个插件让Logstash具备接收Elastic Beats框架发来的 事件 ,诸如PacketBeatMetricBeat都可以向Logstash发送 事件 
本文略过Filebeat的安装过程。
安装好Filebeat后,需要为Filebeat提供配置文件。Filebeat配置文件使用YAML格式。创建filebeat.yml文件,内容如下:
filebeat.prospectors:
\- type: log
paths:
\- /path/to/file/logstash-tutorial.log
output.logstash:
hosts: \[“localhost:5043\]

为了简化配置,这里没有使用TLS/SSL设置——真实世界里,我们需要安全设置。
启动Filebeat:
sudo ./filebeat -e -c filebeat.yml -d “publish”
Filebeat会尝试连接5043端口,因为目前为止,Logstash以及Beats plugin还没有启动,所以不会从这个端口得到应答。

配置Logstash来接受Filebeat输入

下面是Logstash pipeline的配置文件主干:
“`

The # character at the beginning of a line indicates a comment. Use

comments to describe your configuration.

input {
}

The filter part of this file is commented out to indicate that it is

optional.

filter {

#

}

output {
}
“`

这个配置现在还是无法运行的,因为必须的input和output都还没有进行配置。
创建一个配置文件first-pipeline.conf,将上述配置内容写入这个配置文件。
在input段,添加如下代码,来配置Logstash使用Beats输入插件:
beats {
port => "5043"
}

我们是要让Logstash将数据写入Elasticsearch,眼下先让Logstash使用stdout作为输出:
stdout { codec => rubydebug }

此时first-pipeline.conf内容如下:
“`
input {
beats {
port => “5043”
}
}

The filter part of this file is commented out to indicate that it is

optional.

filter {

#

}

output {
stdout { codec => rubydebug }
}
“`

启动Logstash,来检查、验证以上配置(并不是执行这个pipeline)~ logstash的启动很慢的哦!
logstash -f first-pipeline.conf --config.test_and_exit
没有报错,通过验证的话,就正式启动这个pipeline:
logstash -f first-pipeline.conf --config.reload.automatic
—config.reload.automatic选项让Logstash自动的重新装载配置文件。
Logstash启动后,会看到Warning信息:
[2017-11-20T21:08:04,670][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified

放心的忽略这个警告,pipelines.yml是用来配置、运行多个pipeline的,咱目前才刚上路,运行的是pipeline。
如果pipeline工作正常,将会在Logstash的控制台上看到大量的apache访问日志内容—— 我第一次运行就啥也没有,filebeat好像只会在它的配置目录里读取配置文件,-c configfile-path 完全没起作用…… 即使我使用full path也不行。

使用Grok Filter插件,解析Web访问日志

通过上面的努力,一个接受Filebeat传输过来的日志行的pipeline已经正常运行。我们也会注意到,对日志还没有处理,最好是能解析日志行,分解出其中的诸如事件、url,http状态码等信息…… 要完成这些功能,需要使用grok filter插件。
grok filter插件是Logstash默认自带的插件。用来将无结构的日志数据解析成特定结构,以便于查询分析。
下文是apache web日志的示例:
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

从中我们可以看到,这一行日志中包含:
* IP 地址
* User ID
* User Authentication
* 时间戳
* HTTP动作
* 请求
* HTTP版本
* Http返回码
* 提供的字节数
* 引用URL
* 用户Agent
我可以想象,这里头Regex在起作用。
修改之前的first-pipeline.conf 修改filter配置:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}

因为启动时候已经打开配置文件自动更新功能,所以Logstash并不需要重启,但是我们需要强制Filebeat从头在读区日志文件,要实现这个,需要先中断Filebeat运行,然后需要删除Filebeat registry文件,我的系统中(mac,通过homebrew安装),文件在/usr/local/var/filebeat/下
rm /usr/local/var/filebeat/registry
Filebeat在这个文件中会记录读去文件的offset。
删除registry文件后,重新运行Filebeat。
这个时候如果一切正常,Logstash运行的console中,会看到输出中,包含原来的message,这个message也如我们所愿,分割成诸如response bytes clientip等字段。
{
"request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"offset" => 325,
"auth" => "-",
"ident" => "-",
"verb" => "GET",
"prospector" => {
"type" => "log"
},
"source" => "/path/to/file/logstash-tutorial.log",
"message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"@timestamp" => 2017-11-09T02:51:12.416Z,
"response" => "200",
"bytes" => "203023",
"clientip" => "83.149.9.216",
"@version" => "1",
"beat" => {
"name" => "My-MacBook-Pro.local",
"hostname" => "My-MacBook-Pro.local",
"version" => "6.0.0"
},
"host" => "My-MacBook-Pro.local",
"httpversion" => "1.1",
"timestamp" => "04/Jan/2015:05:13:42 +0000"
}

使用Geoip Filter插件

通过grock插件,我们将原始的日志行拆分成很多有用字段,这样的话后续对日志的查询会很方便,filter插件也可以根据已有数据,产生额外的辅助信息。举例来说,geoip插件会检查IP地址,提供地理位置信息,并把相关信息添加到日志。
在Logstash配置文件中添加geoip:
geoip {
source => "clientip"
}

Logstash不用重启,会自动重新装载配置文件,Filesteam需要关闭、删除registry、重新启动~
Logstash输出的信息中,会在原有基础上,增加location、region_name、country code city name postal code 等信息。

在Elasticsearch中索引Logstash输出

完成上述操作后,web日志已经被拆分成不同的字段,Logstash可以将这些数据存储到Elasticsearch中,修改fist-pipeline.conf,修改output配置:
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}

修改后,确认Elasticsearch已经启动,记得要关闭Filesteam、删除registry、启动Filebeat.
curl -XGET "localhost:9200/logstash-2017.11.20/_search?pretty&q=response=200"
通过上述curl命令,查询elasticsearch索引,确认我们的pipeline运行正常,已经将web日志存入elasticsearch。
这个时候也可以启动Kibana,通过web UI来查看Elasticsearch中索引的web日志。 E L K第一次顺畅运行。

Leave Comment