ES解决geoip的location不为geo_point格式
by: 铁乐猫
date: 2020-01-08
环境:
ELK各组件均为7.0版本
出现问题的索引名称为tielemao_web_log*
问题:
使用了geoip插件,入库的索引中location仍不是geo_point格式,以致想做地图经纬度的展示时做不了。
原因:
默认的log_template模板中没有任何匹配。
解决办法:
新建索引模板,设置匹配成geo_point,且优先度调高。
另外为防以后新项目入log重新碰到这个问题,将默认的log_template模板也加上geo_point的相关设置。
默认索引模板添加geoip映射
打开kibana的Dev Tools,本次操作索引模板在web界面下操作比较方便。
log_template会默认就匹配上我们的索引:
在kibana的Dev Tools里的Console中输入
GET /_template/log_template
点击三角形图标执行,右边会出现结果:
{
"log_template" : {
"order" : 0,
"index_patterns" : [
"*log*"
],
"settings" : {
"index" : {
"number_of_replicas" : "0"
}
},
"mappings" : { },
"aliases" : { }
}
}
index_patterns中可以看到匹配索引名称中带log的:
"index_patterns" : [
"*log*"
],
所以以防万一,在这个默认优先级0的模板中也加上:
PUT /_template/log_template
{
"order" : 0,
"index_patterns" : [
"*log*"
],
"settings" : {
"index" : {
"number_of_replicas" : "0"
}
},
"mappings" : {
"properties": {
"client_ip": {
"type": "ip"
},
"geoip": {
"dynamic": true,
"type": "object",
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
},
"aliases" : { }
}
这里主要是看:
"mappings" : {
"properties": {
"client_ip": {
"type": "ip"
},
"geoip": {
"dynamic": true,
"type": "object",
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
},
其中生效的是geoip的那一段,mappings的properties中添加了geoip这个字段,并且使用dynamic,允许Logstash的geoip插件将解析后的详细字段也保存到ES索引中。
geoip插件解析出来会带有一个location字段,这个字段就是经纬度的坐标点,所以重点是这里要设置geoip.location字段的类型是geo_point。
Geo-point表示为一个object,具有lat和lon两个key。
改完可以GET再去看一下生效没有。
新建匹配的索引模板
我这里按照自己的情况新建了一个优先度为10且一定匹配得上的模板,例:
PUT /_template/template_tielemao_weblog
{
"index_patterns" : [
"tielemao_web_log*"
],
"order" : 10,
"mappings": {
"properties": {
"client_ip": {
"type": "ip"
},
"geoip": {
"dynamic": true,
"type": "object",
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
},
"aliases" : {
"tielemao_weblog" : { }
}
}
其中匹配em_web_log*
名字的索引,且order优先度为10,比默认的模板都高:
"index_patterns" : [
"em_web_log*"
],
"order" : 10,
另外还起了个别名,方便以后零停机时间实现重新索引。
效果
新建完索引后,前面入库的索引及索引模式我都删除掉了,防止新索引模板不生效。
删除后,等待新的索引生成,再在索引管理中查看,己经生效了:
之后再在可视化中做展示就可以了,不会在选择Geohash的时候提示你没有geo_point,例:
【End】