這次接到的需求是,可以根據使用者的ip地址,實時展示在我們大中國的地圖上。
被飛哥告知可以在EFK上實現,再經過一番調研,得出以下結論
- 目的效果圖
- 在伺服器上配置GEO外掛。參考地址 github.com/y-ken/fluen…
# for RHEL/CentOS
$ sudo yum groupinstall "Development Tools"
$ sudo yum install geoip-devel --enablerepo=epel
# for td-agent2
$ sudo td-agent-gem install fluent-plugin-geoip
複製程式碼
- 配置td-agent檔案
<filter nginx.**>
@type extract_query_params
key path
only url_path
discard_key true
add_url_path true
add_field_prefix params.
skip_adding_null_record true
</filter>
<filter nginx.**>
@type geoip
geoip_lookup_key remote
geoip_database /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluent-plugin-geoip-1.2.0/data/GeoLiteCity.dat
geoip2_database /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluent-plugin-geoip-1.2.0/data/GeoLite2-City.mmdb
<record>
city ${city.names.zh-CN["remote"]}
country ${country.iso_code["remote"]}
country_name ${country.names.zh-CN["remote"]}
location '[${location.longitude["remote"]},${location.latitude["remote"]}]'
</record>
</filter>
複製程式碼
其中remote欄位為解析出的ip地址。目前線上應該改為 http_x_forwarded_for欄位。 注意,這裡的filter必須分開寫 最終輸出location欄位為解析出的經緯度。
- 配置elasticsearch 配置好以上需求後,直接開啟Kibana的地圖,會出現以下錯誤
No Compatible Fields: The "xxx" index pattern does not contain any of the following field types: geo_point
複製程式碼
主要是因為,在Kibana中檢視地圖選項的資料來源格式應該為geo-point。而現在生成的location資料為number型別,Kibana無法讀取。
所以需要做以下配置。
- 首先,執行以下命令,檢視mappings中的路徑
可以看到mappings下的路徑為fluentd。線上目前是_doc。 然後,執行以下程式碼,設定相應的模板,可以使後面生成的新的索引檔案中,location的型別為geo-point。
PUT _template/logstash
{
"template": "logstash-*",
"mappings": {
"fluentd": {
"properties" : {
"location": { "type": "geo_point"}
}
}
}
}
複製程式碼
至此已經設定完所有配置。接下來主要說哪裡有坑。 第一次配置td-agent的時候,需要把location的欄位登出,保證沒有在新的索引檔案生成之前沒有任何number型別的location寫入,否則,location的geo-point型別不生效。 等到第二天,再把location的登出取消,然後重新整理Kibana中的index pattern就可以看到正常資料了!
至此,打完收工