ELK7.10.1绘制IP热力地图Kibana无法识别geo_point找不到索引
前言
ELK分析日志非常强大,而相关的资料又非常少,并且随着版本升级,旧版配置不兼容新版导致很多坑,本文提供解决访问IP热力地图绘制问题方案。
更多参考win搭建ELK7.10.1分析Nginx日志绘制图表
操作
■ 选用高德地图
默认是英文地图看着很不习惯,改用高德地图。
配置config下的kibana.yml。
添加配置
map.tilemap.url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
如果高德api改变了,就得修改该配置。
■ 创建地图
很多教程都会提到选择区域地图、坐标地图、Coordinate Map之类,这些在新版中已经全部去除,新版中独立的一个Maps。
然后==>创建地图
■ 创建geo_point
① 查看
添加图层 ==》热图 ==》 选择索引模式,会发现没有可以选择的索引。
然后打开索引模式,选择一个索引,点进去查看,会发现没有geo_point类型的字段,这就需要我们去创建一个geo_point类型。
② 修改数据格式
geo_point类型的格式是坑点,在7.10.1中,为如下格式。
所以在logstash.conf中,我们要配置创建这种类型的数据
filter中添加
geoip {
source => "remote_addr"
target => "geoip"
add_field => [ "[coordinates]", "%{[geoip][latitude]},%{[geoip][longitude]}" ]
}
经纬度顺序不能反,source为你自己的Nginx下游ip(也就是客户ip)字段。
③ 设置数据类型
有了coordinates字段,但它的类型仍然是文本,ELK是不会将它字段转换为geo_point类型的。
- 新建文件nginx-logstash.json
创建模板设置coordinates为geo_point类型。
{
"order": 1,
"version": 60001,
"index_patterns": [
"nginx-*"
],
"settings": {
"index": {
"number_of_shards": "1",
"refresh_interval": "5s"
}
},
"mappings": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"mapping": {
"norms": false,
"type": "text"
},
"match_mapping_type": "string"
}
},
{
"string_fields": {
"mapping": {
"norms": false,
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"match_mapping_type": "string",
"match": "*"
}
}
],
"properties": {
"coordinates": {
"type": "geo_point"
}
}
},
"aliases": {}
}
- 修改logstash.conf
output{
elasticsearch {
#这里记得写的是hosts,因为可能会是集群的 elasticsearch,但是配置的之后只要写上主节点就行了
hosts => "localhost:9200"
#规定存储日志的索引规则,动态配置,方便管理
index => "nginx-%{type}=%{+YYYY.MM.dd}"
# 淘汰 type 里的参数 就是上面配置的
# document_type => "%{type}"
template => "路径。。。/ELK/logstash-7.10.1/config/template/nginx-logstash.json"
template_name => "nginx-logstash"
template_overwrite => true
}
stdout{
codec => rubydebug
}
}
- 启动后查看
成功的话,Elasticsearch中就能搜索的到这个模板。
索引信息如下
模板生效,字段类型就会对应上,数据格式正确,采集才会成功。
④ 重新创建索引模式
■ 添加图层
再添加图层,成功。
最后
logstash的索引规则不能乱配,必须在elasticsearch有对应的索引才能成功,像网上文章什么logstash-*、logstash_*之类,ES get请求_template就能获得全部索引,默认自带的索引即便对应上了也一般和自己的数据格式对不上,所以需要自建模板。