ELK利用Nginx绘制用户访问高德世界地图
简介
当一个网站用户逐渐多起来的时候,如何获取用户来源,本文利用解析nginx日志获取用户IP,使用GeoLite2-City.mmdb地图库将IP转为经纬度,然后在Kibana中使用Coordinate Map绘制用户访问世界地图
过程
1、ELK docker
- [sebp/elk](https://hub.docker.com/r/sebp/elk/) 5.6.2
2、GeoIP
- docker sebp/elk 5.6.2中自带有GeoLite2-City.mmdb库,位于 /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-geoip-4.3.1-java/vendor/GeoLite2-City.mmdb目录中
3、配置logstash使用Geoip
- 首先进入docker容器里 docker exec -it xxxxxxxxx /bin/bash - 进入logstash配置文件目录 cd /etc/logstash/conf.d - 可以看见四个默认文件,分别是02-beats-input.conf 10-syslog.conf 11-nginx.conf 30-output.conf 02-beats-input.conf 是输入logstash数据来源(一般使用logstash ==> elasticsearch) 10-syslog.conf 是配置系统日志 11-nginx.conf 是配置nginx日志 30-output.conf 是配置日志输出(一般使用elasticsearch ==> kibana) - 配置02-beats-input.conf文件: input { beats { port => 5044 } } - 配置11-nginx.conf: filter { if [type] == "nginx-access" { grok { match => { "message" => "%{NGINXACCESS}" } } geoip { source => "clientip" target => "geoip" add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float"] } } output { if [type] == "nginx-access" { elasticsearch { hosts => ["xxx.xxx.xxx.xxx:9200"] manage_template => true index => "logstash-*" } } } grok:日格式匹配 geoip: source:通过geoip处理的信息,这里我们为了通过ip获取经纬,所以选择clientip作为处理的对象 target:通过geoip解析出来的地址信息存储在什么字段里,这里指定为geoip add_field:将解析出来的经纬存放在geoip.latitude和geoip.longitude中,并且有一个geoip.coordinates是生成的经纬点 mutate:定义格式为float output: 输出到elasticsearch,host是elk的elasticsearch的IP,默认端口9200 设置index为logstash-*,这在Kibana中创建index的时候会用到 - 重启logstash service logstash restart
4、登录Kibana xxx.xxx.xxx.xxx:5601, 创建index为logstash-*的index
- 步骤: Management ==> index Patterns ==> create Index Pattern ==>在index Pattern中填写logstash-* ==> Time filter 不变,为@timestamp ==>create
5、将自带英文地图更改为高德地图
- 更改Kibana的配置文件 cd /opt/kibana/config vim kibana.yml - 在文件最后添加 tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}' tilemap.options.minZoom: "1" tilemap.options.maxZoom: "10"
6、创建后点击Visualize ==> create new Visualize
创建一个新的Visualize
选择Coordinate Map
选择创建好的logstash-*作为index
- 问题:这时候会出现提示说并没有对应格式的filed能被coordinate map解析,这是因为默认的经纬格式是double类型的,所以我们需要将格式转换为geo_point - 解决方法:就是将geoip.location转为geo_point格式。这样就能被coordinate map识别
7、生成
点击,选择geoip.location作为经纬。立马就生成了世界访问地图