Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能。
Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务。
Kibana是一个带有强大数据整理,分析的web前端,将数据以可视化的方式呈现给用户。
另一个流行的组合为Elasticsearch,Logstash和Kibana(ELK)。两种组合架构完全相同,Logstash和Fluentd的功能也大同小异,目标都是解决日志中心化的问题。但是两者的设计出发点稍有不同,造成在解决问题的优先级,重心上可能稍有不同。Logstash强调灵活性和互操作性,而Fluentd更倾向于简单和鲁棒性(Logstash emphasizes flexibility and interoperability whereas Fluentd prioritizes simplicity and robustness.)。
此处搭建过程推荐一篇深度好文:http://blog.csdn.net/gsying1474/article/details/52426366
按照文章的安装步骤即可完成,但是本人在按步骤的搭建过程中遇到一处错误,如下:
2018-03-06 14:31:37 +0800 [warn]: #0 Elasticsearch rejected 1 documents due to invalid field arguments
2018-03-06 14:31:37 +0800 [error]: #0 Could not push log to Elasticsearch: {"took"=>23, "errors"=>true, "items"=>[{"index"=>{"_index"=>"logstash-2018.03.06", "_type"=>"_doc", "_id"=>nil, "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Failed to parse mapping [_doc]: mapping type name [_doc] can't start with '_'", "caused_by"=>{"type"=>"invalid_type_name_exception", "reason"=>"mapping type name [_doc] can't start with '_'"}}}}]}
此处出现的错误的原因是 Elasticsearch 无法映射以 "_" 开头的映射类型名称,也就是说我们必须在 Fluentd 转发日志至 Elasticsearch 的过程设置中,给映射类型添加相应前缀,来防止映射失败的发生。
解决办法:再次修改 td-agent 的配置(vim /etc/td-agent/td-agent.conf)
@type elasticsearch
host 127.0.0.1
type_name fluentd
include_tag_key true
tag_key log_name
flush_interval 10s # for testing
logstash_format true
logstash_prefix logstash
增加了四句话,分别是:
type_name fluentd // type_name是对应elasticsearch的_type
include_tag_key true // 允许使用tag_key
tag_key log_name // tag_key的参数Log_name是收集Logging文件传入的log_name参数
logstash_prefix logstash // 设置在value值的日期前面增加前缀,如 {"_index": "logstash-2017.11.20"}
修改完保存之后,重启 td-agent 即可实现:
systemctl restart td-agent
systemctl status td-agent