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】