Logstash做为一个数据处理管道,提供了丰富的插件,可以从不一样数据源获取用户数据,进行处理后发送给各类各样的后台。这中间,最关键的就是要对数据的类型就行定义或映射。html
本文讨论的 ELK 版本为 5.5.1。mysql
Elastisearch不只是一个强大的全文检索引擎,它还可以对一些数据类型进行实时的统计运算,相关的结果能够经过Kibana的图表展示出来。若是数据类型没有正确的定义,那么Elasticsearch就没法进行运算了,所以,虽然数据类型的定义须要花一点时间,但你会收到意想不到的效果。linux
全部送往Elasticsearch的数据都要求是JSON格式,Logstash所作的就是如何将你的数据转换为JSON格式。ElasticSearch会帮咱们自动的判断传入的数据类型,这么作固然极大的方便了用户,但也带来了一些问题。git
Elastic中的一些数据类型: text、keyword、date、long、double、boolean、ip、object、nested、geo_point等。不一样的类型有不一样的用途,若是你须要全文检索,那应该使用text类型,若是你须要统计汇总那应该选择数据或者keyword类型。感谢动态映射 Dynamic Mapping 的存在,在向ES送数的时候咱们不须要事先定义映射关系,ES会对新增的字段自动进行映射。可是你比Elasticsearch更加熟悉你的数据,所以可能须要本身进行显示定义 Explicit Mapping 映射关系。例如IP字段,默认是解析成字符串,若是映射为IP类型,咱们就能够在后续的查询中按照IP段进行查询,对工做是颇有帮助的。咱们能够在建立索引时定义,也能够在索引建立后定义映射关系。github
对于已经存在的数据,没法更新映射关系。更新映射关系意味着咱们必须重建索引。web
先来看下面这个JSON文档。sql
{ "@timestamp": "2017-08-11T20:11:45.000Z", "@version": "1", "count": 2048, "average": 1523.33, "host": "elasticsearch.com" }
这里有五个字段:@timestamp
,@version
,count
,average
,host
。其中 @timestamp 和 host 是字符串,count、average 是数字,@version比较特殊,它的值是数字,可是由于放在双引号中,因此做为字符串来对待。apache
尝试把数据送入到 Elasticsearch 中,首先建立一个测试的索引:json
将数据存入索引ruby
查看数据映射的状况
根据结果可知,在没有明肯定义数据类型的状况下,Elasticsearch会自动判断数据的类型,所以 @timestamp、@version、host都被映射为 text ,average、count 被映射为数字。
Logstash提供了 grok 和 mutate 两个插件来进行数值数据的转换。
grok 目前是解析非结构化的日志数据最好的插件。特别适合处理syslog、apache或其余web服务器、mysql等为了阅读而输出的信息类日志。
grok 的基本用法以下:%{SYNTAX:SEMANTIC}
,SYNTAX是grok提供的样式Pattern的名称,grok提供了120多种Pattern,SEMANTIC是你给匹配内容的名称(标志符)。由于grok其实是正则匹配,所以任何输出都默认转换为字符类型,若是你须要数据类型的转换,则使用下面这种格式
%{NUMBER:SEMANTIC:int}
目前,类型转换仅支持 int 和 float 两种类型。
若是将带小数的数字转换为 int 类型,会将小数后的数字丢弃。
mutate 为用户提供了处理Logstash event数据的多种手段。容许咱们移除字段、重命名字段、替换字段、修改字段等操做。
filter { mutate { convert => { "num" => "integer" } } }
Elasticsearch中经过模板来存放索引字段的映射关系,logstash能够在配置文件中指定模板文件来实现自定义映射关系。
查询 Elasticsearch 中的模板,系统自带了 logstash-* 的模板。
咱们用实际的例子来看一下映射和模板是如何起做用的。
一、首先建立一个 logstash 配置文件,经过 filebeat 读取 combined 格式的 apache 访问日志。
配置文件名为 filebeat.conf 位于 logstash 文件夹内。filebeat的配置比较简单,能够参考个人上一篇文章 Filebeat+Logstash+ElasticSearch+Kibana搭建Apache访问日志解析平台
input { beats { port => "5043" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => ["datetime"] } geoip { source => "clientip" } } output { elasticsearch { hosts => "localhost:9200" index => "my_index" #template => "/data1/cloud/logstash-5.5.1/filebeat-template.json" #template_name => "my_index" #template_overwrite => true } stdout { codec => rubydebug } }
第一次数据导入的时候,咱们先不使用模板,看看 es 如何默认映射数据,启动elk环境,进行数据导入。
[maserati@iZ627x15h6pZ logstash-5.5.1]$ ../elasticsearch-5.5.1/bin/elasticsearch [maserati@iZ627x15h6pZ logstash-5.5.1]$ ./bin/logstash -f filebeat.conf [maserati@iZ627x15h6pZ filebeat-5.5.1-linux-x86_64]$ sudo ./filebeat -e -c filebeat.yml -d "publish"
数据导入完成后,看一下索引的状况
由于从log导入的数据,因此mapping中给映射规则起名为log,对应的是 document_type,能够看到clientip和 geoip.location 分别解析成了文本和数值。其余大部份内容都映射为 text 。这种不须要咱们定义映射规则的处理方式很是方便,但有时候咱们更须要精确的映射。
看一下ES映射模板,只有logstash命名的模板,由于名称不匹配,因此没有应用这里的映射规则。
这里能够注意到模板文件和索引中的映射关系稍有不一样,不要紧,咱们把 my_index 的映射关系拷贝下来,存为 filebeat-template.json ,这里贴一下一个删减版的 模板文件。
{ "template": "my_index", "order": 1, "settings": { "index.refresh_interval" : "5s" }, "mappings": { "_default_": { "properties": { "clientip" : { "type":"ip" }, "geoip": { "properties": { "location": { "type":"geo_point" } } } } } } }
咱们能够经过命令行收工把模板上传到 elasticsearch ,也能够经过 logstash 配置文件指定。
curl -XPUT http://localhost:9200/_template/my_index_template?pretty -d @filebeat-template.json
个人例子中,咱们只须要把 filebeat.conf 中的注释打开便可。而后删除索引,咱们对索引重建一下。
看一下索引,能够看到模板中定义的规则已经在里面了。
看一下索引字段,看到 clientip 已经定义成 ip 类型了。
一样,geoip.location映射成 geo_point 类型。
这样咱们就能够作访客地图了。
这时,再看一下 template 的状况。
能够看到,除了默认的模板,新增了一个咱们定义的 my_index 模板。后续还能够对模板进行修改,可是注意只能增长或者删除,没法对已经映射的字段进行更新。
参考资料:
一、Using Logstash to help create an Elasticsearch mapping template
二、Using grok and mutate to type your data
三、Elasticsearch Mapping
四、Grok Filter Plugin
五、Mutate Filter Plugin
六、用logstash导入ES且自定义mapping时踩的坑