0x01 前言

这两天在配置安装ELK5,对于刚入门的我遇到问题后完全是一头雾水…

昨天我遇到一个错误,从filebeat输出到logstash进行处理后的数据在导入到elasticsearch时却出现WARN的log。在经过一天无尽的资料寻找后终于找到了解决办法。

0x02 log

正常情况下filebeat检测到文件变化后开始向logstash输出日志,由logstash进行格式化处理后输出到elasticsearch保存以便通过kibana进行查看。

然而在今天早上我发现通过kibana已经无法查看到任何新增的log,然后我去翻查ELK套件的日志发现logstash出现了许多警告日志:

[2016-11-08T12:47:48,282][WARN ][logstash.outputs.elasticsearch] Failed action. {:status=>404, :action=>["index", {:_id=>nil, :_index=>"filebeat-2016.11.08", :_type=>"log", :_routing=>nil}, 2016-11-08T04:47:45.956Z web.t.com 10.1.1.67 - - [08/Nov/2016:12:47:43 +0800] "POST /jsrpc.php?output=json-rpc HTTP/1.1" 200 47 "http://zabbix.t.com/zabbix.php?action=dashboard.view" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36"], :response=>{"index"=>{"_index"=>"filebeat-2016.11.08", "_type"=>"log", "_id"=>nil, "status"=>404, "error"=>{"type"=>"index_not_found_exception", "reason"=>"no such index", "resource.type"=>"index_expression", "resource.id"=>"filebeat-2016.11.08", "index_uuid"=>"_na_", "index"=>"filebeat-2016.11.08"}}}}

在日志的最后提示了错误的原因:

"error"=>{"type"=>"index_not_found_exception", "reason"=>"no such index", "resource.type"=>"index_expression", "resource.id"=>"filebeat-2016.11.08", "index_uuid"=>"_na_", "index"=>"filebeat-2016.11.08"}

从日志中可以看出是找不到索引:

"type"=>"index_not_found_exception"
"reason"=>"no such index"
"index"=>"filebeat-2016.11.08"

正因为找不到今天的索引,所以logstash无法将数据进行正确的写入。

0x03 原因

在经过无穷无尽的技术文档翻查后突然想起安装x-pack过程中有一句话:

#If you have disabled automatic index creation in Elasticsearch, configure action.auto_create_index in elasticsearch.yml to allow X-Pack to create the following indices:

意思是:如果禁用了Elasticsearch自动创建索引的功能,需要在elasticsearch.yml手动添加action.auto_create_index参数以允许X-Pack自动创建索引。需要在elasticsearch.yml中添加一下一行并重启elasticsearch:

action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*

那么logstash找不到索引是不是因为当天的索引没有创建呢?我通过以下命令检查索引:

curl http://127.0.0.1:9200/filebeat* -u elastic:changeme

返还的内容如下:

1478589975

箭头所指的位置就是索引,错误发生时并没有左侧箭头所指的filebeat-2016.11.08这个索引,这个是我修复错误后生成的。

0x04 解决

问题点找到了,那么解决办法有两种,一种是手动生成索引,另一种是在elasticsearch中赋予logstash创建索引的权限,让logstash自行创建索引。

手动创建索引的方法请参考以下地址:

create index API

手动创建索引的话可以写一个脚本,每天定时或者提前生成索引以供logstash使用。我选择了较为简单的一种方式,即赋予logstash创建索引的权限。在以下文件中添加内容:

#打开文件
[root@web ~]# vim /etc/elasticsearch/elasticsearch.yml

#添加权限
action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*,filebeat*

因为我安装了X-Pack,所以要在X-Pack的索引后添加:filebeat* 即可。然后通过以下命令重启elasticsearch:

[root@web ~]# systemctl restart filebeat.service

重启过程需要一点时间,最重要的是要检查服务是否正常启动:

[root@web ~]# systemctl status filebeat.service 
● filebeat.service - filebeat
   Loaded: loaded (/usr/lib/systemd/system/filebeat.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2016-11-08 02:51:04 CST; 12h ago
     Docs: https://www.elastic.co/guide/en/beats/filebeat/current/index.html
 Main PID: 847 (filebeat)
   CGroup: /system.slice/filebeat.service
           └─847 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

11月 08 02:51:04 web.t.com systemd[1]: Started filebeat.
11月 08 02:51:04 web.t.com systemd[1]: Starting filebeat...

0x05 结语

对于刚入门的我确实走了不少弯路,但我对这个开源项目的技术文档感觉非常好。写得很详细,若遇到问题基本不需要去Google即可在技术文档中找到解决办法。

在经过两天的配置学习,我已经能将服务正确地配置且能平稳地运行,明天我写篇安装过程的文章记录下需要注意的问题。

最后就是要深入学习filter模块,这才是最深奥的地方。