27 Aug 2018
必须要在elasticsearch中的index创建之前来创建这个模板,不然的话,创建这个模板是不会对已经存在的index生效的。
PUT _template/logstash { "order": 0, "version": 60001, "index_patterns": [ "logstash-*" ], "settings": { "index": { "refresh_interval": "5s" } }, "mappings": { "_default_": { "dynamic_templates": [ { "message_field": { "path_match": "message", "match_mapping_type": "string", "mapping": { "type": "text", "norms": false } } }, { "string_fields": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "text", "norms": false, "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } ], "properties": { "@timestamp": { "type": "date" }, "@version": { "type": "keyword" }, "geoip": { "dynamic": true, "properties": { "ip": { "type": "ip" }, "location": { "type": "geo_point" }, "latitude": { "type": "half_float" }, "longitude": { "type": "half_float" } } } } } }, "aliases": {} }
其中最重要的是下面mapping中的geoip部分,主要是定义了location、latitude和longitude字段的格式。
{ "geoip": { "dynamic": true, "properties": { "ip": { "type": "ip" }, "location": { "type": "geo_point" }, "latitude": { "type": "half_float" }, "longitude": { "type": "half_float" } } } }
之所以要配置上面的templates,来自定义mapping规则,将location字段格式化成geo_point格式,是因为在kibana中创建visuallize时,要用到coordinate map。而只有geo_point格式的字段,才能被coordinate map使用,location中记录的是一个ip访问的经纬度信息,通过geo_point格式被kibana的coordinate map加载,才会有在地图上显示客户访问位置的效果
filter {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{NGINXWEB}" }
}
geoip {
source => "clientip"
}
geoip中的source选项,是来指定使用什么grok中的什么字段来作为输入源,所以我们必须在grok的匹配中配置一个名为
clientip的字段。此处的NGINXWEB是我自定义的一个grok pattern,感兴趣的可以参照这篇文章。 geoip中还可以配置database选项来指定自定义的geoip的地址库,可以买商业版。
需要注意的部分是,index名称部分,要和上面templates中定义的index_patterns中配置的匹配起来
output {
elasticsearch {
hosts => ["iporhostname:9200"]
index => "logstash-%{[fields][service]}-%{+YYYY-MM}"
user => "user"
password => "password"
}
}
当配置完logstash,并重启logstash之后,logstash加载我们的配置,会自动去elasticsearch中创建index,此时就会应用我们定义好的template,然后就会自动加入geoip的mapping规则。接下来,我们就需要去kibana处创建visualize了