Вывод Logstash в ElasticSearch с допустимыми типами

Стек ELK успешно настроен.

используя grokdebug.herokuapp.com

мои шаблоны gork также действительны и выгружаются в ElasticSearch

filter {
  if [type] == "some_log" {
grok {
    match => { "message" => '%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}'
             }
overwrite => "message"
     }
                          }
     }

Этот Grok-анализ ввода полностью верен.

и выход

output {
    elasticsearch { 
         protocol => "http" 
                  }
       }

Проблема в том, что все выгружаемые переменные имеют строковый тип.

Как заставить их войти в соответствующий тип в ElasticSearch (правильный тип сопоставления)

time_1, date_1 и number_1 имеют один и тот же тип, который имеет тип

"time_1":{
    "type":"string",
    "norms":{
        "enabled":false
            },
     "fields":{ 
            "raw":{
                 "type":"string",
                 "index":"not_analyzed",
                 "ignore_above":256
                  }
              }
          }

Я хочу, чтобы date_1 индексировался как тип даты, а number_1 - как числовой тип в эластичном поиске.

PS: Можно ли это сделать ?? определите поле Типа Elasticsearch из Logstash.

ИЛИ - Как отправить это поле с правильным типом в ElasticSearch.

Спасибо


person Ratan Kumar    schedule 20.04.2015    source источник


Ответы (2)


В вашем шаблоне Grok используйте форму %{PATTERN:field:datatype}, чтобы превратить захваченные поля в нечто иное, чем строки. Допустимые типы данных: int и float. В вашем случае вы, например, используйте %{NUMBER:number_1:int}, чтобы преобразовать поле number_1 в целое число.

См. документацию по фильтру Grok в разделе Основы Grok.

Другой вариант - использовать фильтр изменения для преобразования типа существующих полей:

mutate {
  convert => ["name-of-field", "integer"]
}

Связанный:

person Magnus Bäck    schedule 20.04.2015
comment
Можем ли мы сделать то же самое для даты и времени? - person Ratan Kumar; 20.04.2015

Вы можете попробовать преобразовать все поля с помощью плагина ruby. В этом примере мы объединяем time_1 и date_1 вместе и конвертируем их в формат Date.

input {
        stdin{}
}

filter {
        grok {
                match => [ "message" , "%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}"]
                        overwrite => "message"
        }
        ruby {
                code => "
                        datetime = event['time_1'] + ' ' + event['date_1']
                        event['datetime'] = Time.strptime(datetime,'%H:%M:%S %d-%m-%Y')
                        event['number_1'] = event['number_1'].to_i
                "
        }
}

output {
        stdout { codec => rubydebug }
}

Если у вас есть другой тип, который нужно преобразовать, вы можете попытаться найти ruby ​​api, чтобы преобразовать их. Надеюсь, это поможет тебе.

person Ben Lim    schedule 20.04.2015