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
返还的内容如下:
箭头所指的位置就是索引,错误发生时并没有左侧箭头所指的filebeat-2016.11.08这个索引,这个是我修复错误后生成的。
0x04 解决
问题点找到了,那么解决办法有两种,一种是手动生成索引,另一种是在elasticsearch中赋予logstash创建索引的权限,让logstash自行创建索引。
手动创建索引的方法请参考以下地址:
手动创建索引的话可以写一个脚本,每天定时或者提前生成索引以供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模块,这才是最深奥的地方。