2015-09-25 85 views
1

我得到了一些日誌,如:映射CITYNAME從Logstash的GeoPoint到Elasticsearch

2015-09-25 12:07:55.441 INFO 17328 --- [][][][] 
XXX.YYY.SomeClass : Someone request in CityX! 

我將其導入到Elasticsearch

{ 
    "_index": "logstash-2015.09.25", 
    "_type": "redis-input", 
    "_id": "AVADGRo7JaVbcBhehzEj", 
    "_score": 1, 
    "_source": { 
     "@timestamp": "2015-09-25T12:21:24.616+08:00", 
     "@version": 1, 
     "message": "Someone request in CityX!", 
     "logger_name": "XXX.YYY.SomeClass", 
     "thread_name": "pool-22-thread-1", 
     "level": "INFO", 
     "level_value": 20000, 
     "HOSTNAME": "host", 
     "host": "192.168.5.194: 57154", 
     "type": "redis-input" 
    } 
} 

我只想映射CityX(任何城市發生在我日誌,並假設我們可以得到每個城市的經度和緯度)到GeoPoint,Elasticsearch,以便我們可以通過Kibana在地圖上顯示用戶請求的數量。我應該怎麼做?

整個管道:

logstash(:4560) --> redis(:6379) --> logstash-indexer --> elasticsearch (:9200) 

配置:

Logstash - > Redis的:

input { 
    tcp { 
    port => 4560 
    codec => json_lines 
    } 
} 

output { 

    redis { 
    host => "10.0.40.155" 
    port => 6379 
    data_type => "list" 
    key => "key_count" 
    } 
} 

的Redis - > Logstash - > Elasticsearch:

input { 
    redis { 
    host => "127.0.0.1" 
    port => 6379 
    type => "redis-input" 
    data_type => "list" 
    key => "key_count" 
    } 
} 

output { 
    stdout {} 
    elasticsearch { 
    host => "10.0.40.156" 
    cluster => "elasticsearch" 
    codec => "json" 
    protocol => "http" 
    } 
} 
+0

您的消息字段是否總是包含一個字符串,類似於'CityX!中的某人請求!你是否已經有了所有城市的地理位置列表,或者你認爲這是動態的? – Val

+0

也正如你所知道的,地球上的城市名稱並不是獨一無二的(即在馬尼拉也有許多城市叫「舊金山」)。所以另一個問題是你想如何處理這個問題?您是否有預先定義的城市列表,您知道它們會出現在日誌中?這個日誌是如何構建的,即城市名稱(例如你的例子中的CityX)來自哪裏? – Val

+0

@Val感謝您的好意。我們從用戶的電話號碼中獲得城市(中文,存在:'f(電話號碼)=城市')。我們有一個數據庫(電話號碼 - >城市),我們可以購買另一個數據庫(城市 - >拉特,長)。我通過一個簡單的grok過濾器解決了我的問題。我會感謝您對我的解決方案的任何評論。 – Sayakiss

回答

2

我的Java程序日誌City,Longitude,Latitude

我的日誌,例如:

ChinaUnicom Zhejiang Hangzhou 30.29294,120.10956 REQUEST 
ChinaUnicom Zhejiang Hangzhou 30.29294,120.10956 REQUEST 
ChinaTelecom Zhejiang Hangzhou 30.29294,120.10956 REQUEST 

Zhejiang是中國的一個省,HangzhouZhejiang城市。

我添加了一個grok過濾器來首先解析日誌,然後使用add_field將其轉換爲Kibana可識別的geo_point。

input { 
    redis { 
    host => "127.0.0.1" 
    port => 6379 
    type => "redis-input" 
    data_type => "list" 
    key => "key_count" 
    } 
} 

filter { 
    grok { 
    match => { "message" => "%{WORD:carrier} %{WORD:province} %{WORD:city} %{BASE10NUM:latitude},%{BASE10NUM:longitude} %{WORD:geo_message}"} 
    add_field => {"geoip.location" => "%{latitude},%{longitude}"} 
    } 
} 

output { 
    stdout {} 
    elasticsearch { 
    host => "10.0.40.156" 
    cluster => "elasticsearch" 
    codec => "json" 
    protocol => "http" 
    } 
} 
+0

很酷,但是,確保你的映射類型定義'geoip.location'爲'geo_point' **之前**你開始索引你的日誌。 – Val

+0

@Val我沒有添加任何額外的配置到我的'elasticsearch',但它認出我的'geoip.location'爲'geo_point'。但是在關於'logstash'的官方文檔中,它們以相同的方式執行。 – Sayakiss

+0

沒關係,我只是確保你有geo_points咀嚼;-) – Val