geoip.location отсутствует после разбора logstash apachelog, карта Kibana Visualizer не работает - PullRequest
1 голос
/ 10 июля 2019

Я использовал logstash для вставки данных в упругий поиск, а файл conf выглядит как

  grok {
             match => [
         "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}",
         "message" , "%{COMMONAPACHELOG}+%{GREEDYDATA:extra_fields}"
         ]
         overwrite => [ "message" ]
      }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
  geoip {
      source => "clientip"
    }

Теперь в Elastic Search отображение выполняется как

{                                                                                                                                                        
   "response" => "200",                                                                                                                              
      "geoip" => {                                                                                                                                   
          "timezone" => "Asia/Kolkata",                                                                                                              
     "country_code3" => "IN",                                                                                                                        
          "location" => {                                                                                                                            
        "lon" => 80.2833,                                                                                                                            
        "lat" => 13.0833                                                                                                                             
    },                                                                                                                                               
       "region_code" => "TN",                                                                                                                        
      "country_name" => "India",                                                                                                                     
         "longitude" => 80.2833,                                                                                                                     
         "city_name" => "Chennai",                                                                                                                   
       "region_name" => "Tamil Nadu",                                                                                                                
          "latitude" => 13.0833,                                                                                                                     
    "continent_code" => "AS",                                                                                                                        
       "postal_code" => "600073",                                                                                                                    
     "country_code2" => "IN",                                                                                                                        
                "ip" => "122.15.151.189"                                                                                                             
},                                                                                                                                                   
  "timestamp" => "31/May/2019:05:12:22 -0700",                                                                                                       
    "request" => "/favicon.ico",                                                                                                                     
      "ident" => "-",                                                                                                                                
       "auth" => "-",                                                                                                                                
      "agent" => "\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\"",          
   "referrer" => "\"http://example.com/\"",            
 "@timestamp" => 2019-05-31T12:12:22.000Z,                                                                                                           
"httpversion" => "1.1",                                                                                                                              
       "verb" => "GET"                                                                                                                               

}

А теперь при попытке загрузить make-визуализатор в KIBANA geoHash не работает, так как geoip.location не определен как «тип»: «geo_point».Я уже вставил все данные.Так что я могу сделать что-нибудь, чтобы изменить отображение и обновить индекс.я понял, что мне нужно добавить дополнительное поле в grok, создать поле «geoip.location» и заново проанализировать весь журнал.но есть ли способ создать столбец в существующем Elastic Index и объединить данные из 2 столбцов?

Like geoip.location2 merged from geoip.location.lon and location.lat  

1 Ответ

1 голос
/ 10 июля 2019

Обычно вы не можете изменить отображение для полей, которые уже присутствуют в индексе
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#_updating_existing_field_mappings

Однако вы можете обновить отображение индекса, добавив другое поле. Вы можете проверить точный синтаксис на основе версии Elastic, которую вы используете , но для меня в Elastic 6.2 сработало следующее:

PUT geo_test1/_mapping/geo_test1
{
  "properties": {
    "geoip": {
      "properties": {
        "location_geo": {
          "type": "geo_point"
        }
      }
    }
  }
}

Затем вы можете использовать update_by_query и небольшой безболезненный скрипт для заполнения данных в новом поле "location_geo" на основе данных, уже присутствующих в geoip.location:

POST geo_test1/_update_by_query
{
  "script": {
    "source": "String lat = ctx._source.geoip.location.lat.toString(); String lon = ctx._source.geoip.location.lon.toString(); ctx._source.geoip.location_geo = lat + ',' + lon",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}
...