提供:ZStack云计算
系列教程
本教程为在CentOS 7上利用Logstash与Kibana实现集中化日志记录系列五篇中的第五篇。
本教程为利用ELK堆栈(Elasticsearch、Logstash与Kibana)在Ubuntu 14.04上实现集中化日志记录系列五篇中的第五篇。
内容简介
IP地理位置用于确定IP地址的物理位置,可被用于多种实际场景,包括内容个性化与流量分析等等。根据地理位置进行流量分析可帮助大家有效分析自己的用户群体,从而了解用户来自哪里、决定应用服务器的理想地理位置并明确掌握用户定位。在本教程中,我们将共同了解如何利用Elasticsearch、Logstash与Kibana配合一套GeoIP数据库,从而建立应用用户IP地址的可视化地理位置映射。
以下为其工作原理的简单说明。Logstash利用GeoIP数据库将IP地址转换为纬度与经度坐标对,即IP地址的近似地理位置。此坐标数据由Elasticsearch中的geo_point字段负责存储,另外亦可进一步转换为geohash字符串。Kibana随后读取该Geohash字符串并将其绘制为地图上的点,即由Kibana 4实现Tile Map可视化。
下面来看先决条件。
先决条件
要完成本教程,大家必须拥有一套能够运行的ELK堆栈。另外,大家还需要包含IP地址且能够被过滤为字段的日志,例如Web服务器访问日志。如果这两项条件尚不满足,大家可以首先参阅下面两篇教程:
- 如何在Ubuntu 14.04上安装Elasticsearch、Logstash与Kibana 4
- 添加Logstash Filter以改进集中化日志记录
向Filebeat目录中添加geo_point映射
假设大家已经完成了之前的教程,这里我们要重复这一步骤,因为TileMap可视化机制要求GeoIP坐标以geo_point类型的形式存储在Elasticsearch当中。
在Elasticserach的安装服务器上,将Filebeat索引模板下载至主目录:
- cd ~
- curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
利用以下命令加载该模板:
- curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
下载最新GeoIP数据库
MaxMind提供免费与付费GeoIP数据库——其中付费版本的准确度更高。Logstash还提供免费GeoIP City数据库的一套副本,GeoLite City。在本教程中,我们将下载最新GeoLite City数据库,但大家也可以任意选择其它不同的GeoIP数据库。
下面将最新GeoLite CIty数据库的gzip归档文件下载至/etc/logstash目录。运行以下命令:
- cd /etc/logstash
- sudo curl -O "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz"
现在将其解压:
- sudo gunzip GeoLiteCity.dat.gz
GeoLite CIty数据库将被提取至/etc/logstash/GeoLiteCity.dat,我们可以在Logstash配置文件中指向这一位置。
请注意,GeoLite数据库由MaxMind于每月第一个周二进行更新。因此,如果大家希望保持数据库处于最新版本,则应设置一项cron任务以保证每月下载该数据库。
接下来配置Logstash以使用GeoIP数据库。
配置Logstash以使用GeoIP
为了让Logstash存储GeoIP坐标,大家需要指定包含有一条公共IP地址且生成日志的应用,我们将过滤该IP地址以作为独立字段。一般来说,Web服务器可以充当这一日志生成应用,例如Nginx或者Apache,这里我们使用Nginx作为示例。
在向Logstash中添加Filter教程中,Nginx filter被存储在名为11-nginx-filter.conf的文件当中。如果大家的filter处于其它位置,请编辑该文件中的对应部分。
下面编辑Nginx filter:
- sudo vi /etc/logstash/conf.d/11-nginx-filter.conf
在grok部分之下(在if [type]…区段处)添加以下行:
11-nginx-filter.conf excerpt
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
cOnvert=> [ "[geoip][coordinates]", "float"]
}
如此一来,filter就会利用GeoLite City数据库对存在于clientip字段(在源中指定)内的IP地址进行转换。我们之所以将该源指定为“clientip”,是因为这正是Nginx用户IP地址存储所使用的字段名称。
在添加之后,为了明确filter的实际内容,我们这里放出11-nginx-filter.conf文件的完整版本:
11-nginx-filter.conf — updated
filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
cOnvert=> [ "[geoip][coordinates]", "float"]
}
}
}
保存并退出。
重启Logstash以应用变更。
- sudo service logstash restart
如果一切配置正确,Logstash现在应该会利用Nginx访问日志存储GeoIP坐标。请注意,此变更不可追溯,因此我们之前生成的日志将不会包含GeoIP信息。
下面验证GeoIP功能是否能够在Kibana中正确起效。
接入Kibana
Logstash配置情况的最简单验证方式就是启用GeoIP,而后在浏览器中打开Kibana。
找到已经在Logstash中启用GeoIP模块后所生成的日志信息。在Nginx示例中,我们可以在Kibana中搜索“nginx-access”类型以缩小日志选择范围。
接下来打开一条信息以查看其字段表。大家应该会看到包含有IP地址如何与真实地理位置相映射的新geoip字段。例如:
注意:如果大家看不到任何日志,首先访问应用以生成日志,而后确保时间过滤器设定正确的时间段。如果大家还是看到GeoIP信息(或者信息不正确),那么Logstash配置可能存在问题。
如果大家在此视图中看到了正确的GeoIP信息,则可创建自己的可视化映射图了。
创建Tile Map可视化映射
注意:如果大家还没有使用Kibana可视化机制,请参阅Kibana仪表板与可视化机制教程。
为了对Kibana中的IP地址进行映射,让我们创建一套Tile Map可视化图。
点击主菜单中的Visualize。
在Creat a new visualization条目之下,选择Tile map。
在Select a search source中,大家可以选择任意选项。如果大家已经保存了一条能够找到所要映射的日志信息的搜索结果,则可直接选择该条搜索。
在Select buckets type中,选择Geo Coordinates。
在Aggregation下拉菜单中,选择Geohash。
在Field下拉菜单中,选择geoip.location。
现在点击绿色的Apply按钮。
如果选定的日志中包含GeoIP信息,则其会被用于绘制映射图,具体如上图所示。
请确保使用Precision滑块以及视图选项下的条目以调整可视化图的显示效果。Precision尚志能够调整用于映射位置的Geohash字符串的长度。
如果大家对可视化图感到满意,则可直接保存。
总结
现在大家已经能够在Kibana当中对GeoIP信息进行映射了。这套方案可以帮助各位了解用户的真实地理位置。如果将其添加至仪表板当中,其实用性还将得到进一步提升。
祝大家好运!
本文来源自DigitalOcean Community。英文原文:How To Map User Location with GeoIP and ELK (Elasticsearch, Logstash, and Kibana) By Mitchell Anicas
翻译:diradw