在今天的讲座里,我们来讲述一下如何把Filebeat里的数据传入到Logstash之中。在做这个练习之前,我想信大家已经安装我之前的文章“如何安装Elastic栈中的Logstash”把Logstash安装好。
之前,我们介绍了一这样的一幅图:
如上图所示,我们可以直接把beats里的数据直接传入到Elasticsearch,也可以直接接入到Logstash之中。
数据采集流程:
既然beats可以直接把数据直接写入到Elasticsearch之中,为什么我们还需要Logstash呢?这主要的原因是因为Logstash有丰富的filter供我们使用,可以帮我们加工数据,并最终把我们的数据转为我们喜欢的格式。beats在ELK中是一个非常轻量级的应用。是用go语言写的。它不需要有很强大的运行环境来运行。它通常运行于客户端中。
为了方便我们的说明,我们先创建一个简单的sample.log文件。这个文件可以位于你电脑的任何位置。为了方便,我们把这个文件存于Filebeat的安装的根目录下。它的内容如下:
2019-09-09T13:00:00Z Whose woods these are I think I know.
2019-09-09T14:00:00Z His house is in the village, though;
2019-09-09T15:00:00Z He will not see me stopping here
2019-09-09T16:00:00Z To watch his woods fill up with snow.
2019-09-09T17:00:00Z My little horse must think it queer
2019-09-09T18:00:00Z To stop without a farmhouse near
2019-09-09T19:00:00Z Between the woods and frozen lake
2019-09-09T20:00:00Z The darkest evening of the year.
2019-09-09T21:00:00Z He gives his harness bells a shake
2019-09-09T22:00:00Z To ask if there is some mistake.
2019-09-09T23:00:00Z The only other sound's the sweep
2019-09-09T00:00:00Z Of easy wind and downy flake.
2019-09-09T01:00:00Z The woods are lovely, dark, and deep,
2019-09-09T02:00:00Z But I have promises to keep,
2019-09-09T03:00:00Z And miles to go before I sleep,
2019-09-09T04:00:00Z And miles to go before I sleep
这是一首英文诗。
我们可以在你电脑的任何一个位置建立一个Logstash的配置文件,比如,我们建立一个叫做logstash-beats.conf的文件:
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
filter {
grok {
match => [
"message", "%{TIMESTAMP_ISO8601:timestamp_string}%{SPACE}%{GREEDYDATA:line}"
]
}
date {
match => ["timestamp_string", "ISO8601"]
}
mutate {
remove_field => [message, timestamp_string]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
user => elastic
password => "your password"
}
stdout {
codec => rubydebug
}
}
在这里,我想来说明一下:
2019-09-09T13:00:00Z Whose woods these are I think I know.
2019-09-09T13:00:00Z:使用TIMESTAMP_ISO8601匹配,并形成一个叫做timestamp_string的字符串。SPACE用来匹配时间后面的空格,而剩下的部分由GREEDYDATA进行匹配,并存于line这个字符串中。比如针对我们的例子line就是“Whose woods these are I think I know.”字符串
在接下来的实验中,我们可以把上面的这些filter注释掉,你可以看看在输出中有什么变化。这里的filter是安装顺序从上到下执行的。在实际的练习中,我们可以把上面的mutate和date进行调换,我们应该看到不同的结果。
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-poem"
document_type => "_doc"
user => elastic
password => "YourPassword"
}
stdout {
codec => rubydebug
}
}
更多关于filter的介绍,可以参阅我们的官方网址“Filter plugins”。
在Logstash中,按照顺序执行的处理方式被叫做一个pipeline。一个pipeline含有一个按照顺序执行的逻辑数据流。pipeline从input里获取数据,并传送给一个队列,并接着传入到一些worker去处理:
配置好Logstash后,我们可以使用如下的命令来执行:
$ ./bin/logstash -f ~/data/logstash-beats.conf
在这里,我把logstash-beats.conf放置于我home目录下的一个叫做data的子目录。大家需要根据自己的文件位置进行修改。这样我们的logstash就已经运行起来了。
deb:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-amd64.deb
sudo dpkg -i filebeat-7.3.1-amd64.deb
rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
sudo rpm -vi filebeat-7.3.1-x86_64.rpm
mac:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.3.1-darwin-x86_64.tar.gz
brew:
brew tap elastic/tap
brew install elastic/tap/filebeat-full
linux:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.3.1-linux-x86_64.tar.gz
这样我们的Filebeat就安装好了。请注意:由于ELK迭代比较快,我们可以把上面的版本7.3.1替换成我们需要的版本即可。
在Filebeat的根目录下,我们可以发现一个叫做filebeat.yml的文件。它里面有些描述可以帮我们理解如何配置这个文件。为了方便,我们直接把这个文件改成如下的内容:
filebeat.inputs:
- type: log
enabled: true
paths:
- ./sample.log
output.logstash:
hosts: ["localhost:5044"]
这里需要注意的是之前有的文章里第一行写的是filebeat.prospectors。经过测试在新的版本里不再适用。
我们在这里可以看到Filebeat会帮我们把sample.log文件读入,并写入到logstash中。它使用了一个5044端口地址。这个地址在我们如下的Longstash配置中,我们将会使用到。我们可以通过如下的命令来运行filebeat:
$ ./filebeat
在默认的情况下,filebeat会自动寻找定义在filebeat.yml文件里的配置。如果我们的配置文件是另外的名字,我们可以通过如下的命令来执行filebeat:
$ ./filebeat -c YourYmlFile.yml
Filebeat的registry文件存储Filebeat用于跟踪上次读取位置的状态和位置信息。
data/registry
针对 .tar.gz
and .tgz
归档文件安装/var/lib/filebeat/registry
针对 DEB 及 RPM 安装包c:\ProgramData\filebeat\registry
针对 Windows zip 文件如果我们想重新运行数据一遍,我们可以直接到相应的目录下删除那个叫做registry的目录即可。针对.tar.gz的安装包来说,我们可以直接删除这个文件:
localhost:data liuxg$ pwd
/Users/liuxg/elastic/filebeat-7.3.0-darwin-x86_64/data
localhost:data liuxg$ rm -rf registry/
那么重新运行上面的./filebeat命令即可。它将会重新把数据从头再进行处理一遍。这对于我们的调试来说是非常用用的。
在输出确认请求之前,Filebeat不会考虑发新的送日志行。 由于将行传送到配置的输出的状态保留在注册表文件中,因此您可以安全地假定事件将至少一次传送到配置的输出,并且不会丢失任何数据
当我们运行完我们的filebeat应用,我们可以在logstash的屏幕上看到:
这里除了我们之前看到的那些数据之外,我们也可以看到其他很多不同的字段。这些都是filebeat自动帮我们加入进去的。因为我们加入了date过滤器,我们可以看@timestamp也取自之前的timestamp_string的值。在实际的调试中,我们可以把filter一个个地去掉或加上,这样在我们的屏幕上,我们可以看到不同的输出。这个留给大家来做自己的实验。
我们可以回到Kibana,通过查看一个叫做“logstash_poem”的index:
至此,我们已经完成了通过filebeat的方法把一个log文件传输到Elasticsearch之中。