2015-09-25 90 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