2015-04-20 3 views
0

ELK Stack был успешно настроен.Выход Logstash для ElasticSearch с допустимыми типами

использование grokdebug.herokuapp.com

моих шаблонов Горки, также действителен и получение сбрасывали в 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" 
        } 
     } 

Проблема все сброшенные переменные имеют тип String.

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

time_1, дата_1 и Число_1 все имеет такой же тип, который имеет тип

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

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

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

OR - Как отправить это поле с соответствующим типом в ElasticSearch.

Благодаря

ответ

1

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

См. grok filter documentation под Grok Основы.

Другой вариант заключается в использовании mutate filter преобразовать тип существующих полей:

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

Похожие:

+0

Можем ли мы сделать то же самое для даты и времени ?? –

0

Вы можете попытаться преобразовать все поля с помощью плагина 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 для их преобразования. Надеюсь, это может вам помочь.

Смежные вопросы