Kibana地理地图错误 - 未显示客户端IP字段

时间:2015-03-30 11:04:05

标签: logstash kibana-4

我正在尝试使用kibana-4地理地图来处理ELB日志

当我点击发现标签时,我可以清楚地看到一个字段geoip.location,其值为[lat,lon] 但当我点击可视化标签 - >平铺地图 - >新搜索 - >地理坐标 我得到一个错误(没有显示任何错误我还检查了kibana日志 - 但没有任何东西)

我检查了检查元素 - 也没有检查

然后我选择GeoHash,但该字段为空(当我点击它的空白时带有一个复选图标)

我怎样才能看出错误是什么? 如何让这张地图发挥作用?

我的配置是:

    input {
  file {
    path => "/logstash_data/logs/elb/**/*"
    exclude => "*.gz"
    type => "elb"
    start_position => "beginning"
    sincedb_path => "log_sincedb"
  }
}

filter {
    if [type] == "elb" {
      grok {
        match => [
          "message", '%{TIMESTAMP_ISO8601:timestamp} %{NGUSERNAME:loadbalancer} %{IP:client_ip}:%{POSINT:client_port} (%{IP:backend_ip}:%{POSINT:backend_port}|-) %{NUMBER:request_processing_time} %{NUMBER:backend_processing_time} %{NUMBER:response_processing_time} %{POSINT:elb_status_code} %{INT:backend_status_code} %{NUMBER:received_bytes} %{NUMBER:sent_bytes} \\?"%{WORD:method} https?://%{WORD:request_subdomain}.server.com:%{POSINT:request_port}%{URIPATH:request_path}(?:%{URIPARAM:query_string})? %{NOTSPACE}"'
        ]
      }

      date {
        match => [ "timestamp", "ISO8601" ]
        target => "@timestamp"
      }

      if [query_string] {
        kv {
          field_split => "&?"
          source => "query_string"
          prefix => "query_string_"
        }
        mutate {
          remove => [ "query_string" ]
        }
      }

      if [client_ip] {
        geoip {
         source => "client_ip"
         add_tag => [ "geoip" ]
        }
      }

      if [timestamp] {
        ruby { code => "event['log_timestamp'] = event['@timestamp'].strftime('%Y-%m-%d')"}
      }
    }
  }
}

output {
  elasticsearch {
    cluster => "ElasticSearch"
    host => "elasticsearch.server.com"
    port => 9300
    protocol => "node"
    manage_template => true
    template => "/etc/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json"
    index => "elb-%{log_timestamp}"
  }

}

2 个答案:

答案 0 :(得分:1)

geo_ip索引在我的情况下不起作用,因为我的索引名称没有以logstash开头 -

如果您希望自定义索引名称获取geo-ip,则必须为该索引名称创建模板

弹出搜索的输出中的

使用它

elasticsearch {
      manage_template => true
      template => "/etc/logstash/templates/custom_template.json"
}

您的模板应该如下所示

{
  "template" : "index_name-*",
  "settings" : {
  "index.refresh_interval" : "5s"
},
"mappings" : {
"_default_" : {
   "_all" : {"enabled" : true, "omit_norms" : true},
   "dynamic_templates" : [ {
     "message_field" : {
       "match" : "message",
       "match_mapping_type" : "string",
       "mapping" : {
         "type" : "string", "index" : "analyzed", "omit_norms" : true
       }
     }
   }, {
     "string_fields" : {
       "match" : "*",
       "match_mapping_type" : "string",
       "mapping" : {
         "type" : "string", "index" : "analyzed", "omit_norms" : true,
           "fields" : {
             "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
           }
       }
     }
   } ],
   "properties" : {
     "@version": { "type": "string", "index": "not_analyzed" },
     "geoip"  : {
       "type" : "object",
         "dynamic": true,
         "properties" : {
           "location" : { "type" : "geo_point" }
         }
      }
   }
 }
}
}

答案 1 :(得分:0)

在我们的地图上,我们指定一个字段geoip.location,根据文档由geoip过滤器自动创建。

你能在发现中看到那个领域吗?如果没有,您可以尝试修改您的geoip过滤器

if [client_ip] {
  geoip {
     source => "client_ip"
     add_tag => [ "geoip" ]
     target => "geoip"
  }
}

并查看您是否现在可以在新条目中看到geoip.location?

elasticsearch模板寻找" geoip"创建关联的geoip字段时的目标。

一旦我们创建了geoip.location,我们就可以在Kibana 4中使用以下步骤创建一个新地图。

  1. 点击visualize
  2. 选择' Tile Map'来自可视化类型列表
  3. 选择新搜索或保存 - 我们使用保存的搜索来过滤掉Apache条目,但只要数据包含geoip.location,您应该很好
  4. 选择' geo coordinates'存储桶类型 - 此时会标记错误
  5. 在' aggregation'下拉菜单,选择' geohash'
  6. 在' field'下拉菜单,选择' geoip.location'