← Back to list

Elasticsearch(60) — GeoIP 檔案的放置位置,驗證 GeoIP 功能

有遇到客戶問說為什麼他們的 GeoIP 的解析是以前的 GeoIP,所以就去找了 Elasticsearch, Logstash 的 GeoIP 檔案的放置位置

Tako · 2025-08-06 05:31 · 0 claps · 5.2 min read
#elasticsearch #logstash #geoip
Open on Medium ↗

Elasticsearch(60) — GeoIP 檔案的放置位置,驗證 GeoIP 功能

有遇到客戶問說為什麼他們的 GeoIP 的解析是以前的 GeoIP,所以就去找了 Elasticsearch, Logstash 的 GeoIP 檔案的放置位置

這篇會順便把 Logstash GeoIP 的測試檔給寫上來,也會寫一下 Logstash 的設定,但就算在 yml 中進行設定看起來也不會自動下載就是了

  • Elasticsearch

首先如果 ES 有對外的話,理論上會自動下載 mmdb,使用 find 的指令查找會看到有 2 個地方有這個檔案

但在 /usr/share 下的檔案是 2018 的,所以應該不是,在 /tmp 下的才是,不過把東西載到 /tmp 也是蠻詭異的,實際確認更新日期也是當天的日期

在 ES 上用 find 查找只有 2 個地方有 mmdb

在 ES 上用 find 查找只有 2 個地方有 mmdb

在 /tmp 下的檔案是近期更新的,會是對的檔案

在 /tmp 下的檔案是近期更新的,會是對的檔案

然後 ES 有對外的話不用額外設定,但因為預設是會自動抓取,所以若是封閉環境的話,要記得用 API 把這個功能關掉,否則會持續噴錯

然後下方是使用 Kibana 測試 elasticsearch 的結果,直接貼 API 跟圖

# 建立 geoip pipeline,檢驗 ES 的 geolite 套件
PUT _ingest/pipeline/geoip-pipeline
{
  "description": "Add geoip info based on ip field",
  "processors": [
    {
      "geoip": {
        "field": "ip",
        "target_field": "geoip",
        "database_file": "GeoLite2-City.mmdb"
      }
    }
  ]
}

# 建立測試 index
PUT test-index

# 建立 document,並使用該 geo pipeline
PUT test-index/_doc/1?pipeline=geoip-pipeline
{
  "ip": "8.8.8.8"
}

# 取得 document 資訊
GET test-index/_doc/1

# 刪除測試用 index
DELETE test-index

在 Devtool 中,測試 API 是成功的,可以看到有對應的 Geo Location

在 Devtool 中,測試 API 是成功的,可以看到有對應的 Geo Location

  • Logstash

如果在 Logstash 中下 find,會多在 logstash 的 module 中看到,但這個 GeoIP 檔案的更新日期很舊,所以應該不是參照它

所以就寫了一個 geoip-test.conf,想說先看看會不會直接噴錯,這個用測試的指令去跑,然後發現跑的起來,當中的訊息還有 geoip 檔案的放置位置

# geoip-test.conf
input {
  stdin { }
}

filter {
  mutate {
    add_field => { "ip" => "%{message}" }
  }

  geoip {
    source => "ip"
    target => "geoip"
    add_field => { "[debug]" => "geoip_success" }
  }
}

output {
  stdout { codec => rubydebug }
}

寫好之後,用以下指令進行測試

# 用 bin 下的 logstash,帶 -f 去啟動某個 .conf 檔做測試
/home/elastic/logstash/bin/logstash -f /home/elastic/logstash/config/conf.d/geoip-test.conf

在啟動時會看到有 mmdb 的檔案了,但在前面的 find 並沒有看到該路徑下的 mmdb

有寫 geoip database has been updated

有寫 geoip database has been updated

然後就可以輸入 IP 進行測試了,因為有下載,所以理論上會成功

去檔案的下載路徑下看,的確有檔案存在,且是剛剛下載的

之後看了一下官網文件,在 yml 中可以寫入更新 mmdb 的網址及頻率,若是不設定則不會更新

但實際上設定之後,也沒有依時間進行更新,所以不太確定是不是設定爽的,但若是後續要用,應該會跑這個 geoip-test.conf 來進行 mmdb 的更新

# logstash.yml 中關於 geoip 的設定

# 是否啟用 geoip download
xpack.geoip.downloader.enabled: true

# 下載 geoip.mmdb 的下載點,這裡是寫 elastic 的預設參數
xpack.geoip.downloader.endpoint: "https://geoip.elastic.co/v1/database"

# 多久更新一次,預設是 24 小時,我這邊縮短成 6 小時,但也沒有用...
xpack.geoip.downloader.poll.interval: 6h

反正大致上是這樣,有空才會再研究 logstash 的 geoip 的設定是不是有寫錯的地方,不過是照著官網寫的,應該是沒有錯才對

又被客戶的問題提高了一點實力,雖然看文件真的還是頭挺痛的,而且 Elasticsearch 的官網都寫的超級鳥,設定完了可能也不作用,真的是蠻多 bug 的

參考資料:

  1. ChatGPT

메타데이터
post_id
27dfb080e5a9
slug
elasticsearch-60-geoip-檔案的放置位置-驗證-geoip-功能-27dfb080e5a9
url
https://medium.com/@King610160/elasticsearch-60-geoip-%E6%AA%94%E6%A1%88%E7%9A%84%E6%94%BE%E7%BD%AE%E4%BD%8D%E7%BD%AE-%E9%A9%97%E8%AD%89-geoip-%E5%8A%9F%E8%83%BD-27dfb080e5a9
canonical_url
https://medium.com/@King610160/elasticsearch-60-geoip-%E6%AA%94%E6%A1%88%E7%9A%84%E6%94%BE%E7%BD%AE%E4%BD%8D%E7%BD%AE-%E9%A9%97%E8%AD%89-geoip-%E5%8A%9F%E8%83%BD-27dfb080e5a9
author_url
https://medium.com/@King610160
status
ok
fetched_at
2026-06-25 07:00:49