我們通過Logstash收集的Nginx Access log中已經包含了客戶端IP的數據(remote_addr),但是只有這個IP還不夠,要在Kibana的顯示請求來源的地理位置還需要借助GeoIP數據庫來實現。GeoIP 是最常見的免費 IP 地址歸類查詢庫,同時也有收費版可以采購。GeoIP 庫可以根據 IP 地址提供對應的地域信息,包括國別,省市,經緯度等,對於可視化地圖和區域統計非常有用。
另外GeoIP數據文件的准確性和geoip插件的性能還是比較頭疼,對性能有要求的可以看下@三斗室寫的JRuby 調用 maxmind-java 測試。
一、下載GeoIP數據庫
# cd /etc/logstash/ # wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz # gzip -d GeoLiteCity.dat.gz
Linux系統MaxMind提供了GeoIP更新程序,可以自動更新數據庫。CentOS可以通過epel源來安裝 geoipupdate 。
修改配置文件 /etc/GeoIP.conf 中 ProductIds GeoLite2-City ,然后直接執行 geoipupdate ,便會自動下載並校驗數據庫文件。默認數據庫文件目錄為: /usr/local/share/GeoIP ,可以通過配置項 DatabaseDirectory /etc/logstash/ 更改數據庫文件目錄。
二、配置logstash,在filter中加入geoip配置即可
if [message] !~ "^127\.|^192\.168\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[01]\.|^10\." { #排除私網地址 geoip { source => "message" #設置解析IP地址的字段 target => "geoip" #將geoip數據保存到一個字段內 database => "/usr/share/GeoIP/GeoLite2-City.mmdb" #IP地址數據庫 } }
得到的結果如下:
"geoip" => { "ip" => "112.90.16.4", "country_code2" => "CN", "country_code3" => "CHN", "country_name" => "China", "continent_code" => "AS", "region_name" => "30", "city_name" => "Guangzhou", "latitude" => 23.11670000000001, "longitude" => 113.25, "timezone" => "Asia/Chongqing", "real_region_name" => "Guangdong", "location" => [ [0] 113.25, [1] 23.11670000000001 ] }
GeoIP 庫數據較多,如果你不需要這么多內容,可以通過 fields 選項指定自己所需要的。下例為全部可選內容:
geoip { fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone"] }
需要注意的是:geoip.location 是 logstash 通過 latitude 和 longitude 額外生成的數據。所以,如果你是想要經緯度又不想重復數據的話,需要在geoip中配置: remove_field => ["[geoip][latitude]", "[geoip][longitude]"] 。
三、利用UserAgent顯示瀏覽器信息
Logstash中的 logstash-filter-useragent 插件可以幫助我們過濾出瀏覽器版本、型號以及系統版本。
if [user_agent] != "-" { useragent { target => "ua" source => "user_agent" } }
使用if語句,只有在 user_agent 字段不為空時才會使用該插件。
target 將過濾出來的 user agent 信息配置到單獨的字段中。
source 為必填設置,設置為包含 user agent 的字段。
實例:
user agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
通過 logstash-filter-useragent 過濾出來的結果為:
"ua" => { "patch" => "2883", "os" => "Windows 7", "major" => "55", "minor" => "0", "name" => "Chrome", "os_name" => "Windows 7", "device" => "Other" }