2017-01-18 3 views
1

Я ищу расщепление/фильтр для следующего массива JSON. Нам нужно каждое значение в массиве как одно значение в эластике.Разбор/разделение вложенного одиночного массива JSON в Logstash

{ "Mot_Temp_Test": { "ИНТ": [ "0", "0", "0", "0", "0", "0", "0", "0", " 0" , "0", "0", "0"]}}

+0

Вам нужен другой документ для каждого элемента массива или другое поле для каждого элемента массива в одном документе? –

+0

Я хочу другое поле для каждого элемента массива –

+0

[Это] (https://discuss.elastic.co/t/how-to-split-array-without-a-target/1590/2) может быть полезным и все еще похоже, проблема! – Kulasangar

ответ

0

(Эти результаты тестов я побежал, используя logstash 2,4, выход rubydebug кодек)

используя codec => "json" в вашем входе logstash фактически увидит ваш массив как массив. Я пронумеровал, чтобы рассказать им обо всем.

{ 
    "Mot_Temp_Test" => { 
     "INT" => [ 
      [ 0] "0", 
      [ 1] "1", 
      [ 2] "2", 
      [ 3] "3", 
      [ 4] "4", 
      [ 5] "5", 
      [ 6] "6", 
      [ 7] "7", 
      [ 8] "8", 
      [ 9] "9", 
      [10] "10", 
      [11] "11" 
     ] 
    }, 
     "@version" => "1", 
     "@timestamp" => "2017-01-20T16:55:42.606Z", 
      "host" => "b5963373fadd" 
} 

Logstash не работает при работе с массивами, но он может получить к ним доступ. Таким образом, мы можем использовать mutate filter для переименования элемента массива в поле.

filter { 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int0" } } 
} 

дает нам:

{ 
    "Mot_Temp_Test" => { 
     "INT" => [ 
      [ 0] "0", 
      [ 1] "0", 
      [ 2] "0", 
      [ 3] "0", 
      [ 4] "0", 
      [ 5] "0", 
      [ 6] "0", 
      [ 7] "0", 
      [ 8] "0", 
      [ 9] "0", 
      [10] "0" 
     ] 
    }, 
     "@version" => "1", 
     "@timestamp" => "2017-01-20T17:08:00.728Z", 
      "host" => "5780e869e09f", 
      "int0" => "0" 
} 

Хорошо, так что это должно быть просто. , ,

filter { 
    mutate { 
     rename => { "[Mot_Temp_Test][INT][0]" => "int0" } 
     rename => { "[Mot_Temp_Test][INT][1]" => "int1" } 
     rename => { "[Mot_Temp_Test][INT][2]" => "int2" } 
     rename => { "[Mot_Temp_Test][INT][3]" => "int3" } 
     rename => { "[Mot_Temp_Test][INT][4]" => "int4" } 
     rename => { "[Mot_Temp_Test][INT][5]" => "int5" } 
     rename => { "[Mot_Temp_Test][INT][6]" => "int6" } 
    } 
} 

Но подождите, эти операции обрабатываются один за другим, и после того, как что-то удаляется, то филенками массив, и мы получаем:

{ 
    "Mot_Temp_Test" => { 
     "INT" => [ 
      [0] "1", 
      [1] "3", 
      [2] "5", 
      [3] "7", 
      [4] "9", 
      [5] "11" 
     ] 
    }, 
     "@version" => "1", 
     "@timestamp" => "2017-01-20T18:48:31.875Z", 
      "host" => "a802749c44fe", 
      "int0" => "0", 
      "int1" => "2", 
      "int2" => "4", 
      "int3" => "6", 
      "int4" => "8", 
      "int5" => "10" 
} 

Пытаясь объяснить это:

filter { 
    mutate { 
     rename => { "[Mot_Temp_Test][INT][0]" => "int0" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int1" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int2" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int3" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int4" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int5" } 
     rename => { "[Mot_Temp_Test][INT][0]" => "int6" } 
    } 
} 

Не работает точно:

{ 
                  "Mot_Temp_Test" => { 
     "INT" => [ 
      [ 0] "1", 
      [ 1] "2", 
      [ 2] "3", 
      [ 3] "4", 
      [ 4] "5", 
      [ 5] "6", 
      [ 6] "7", 
      [ 7] "8", 
      [ 8] "9", 
      [ 9] "10", 
      [10] "11" 
     ] 
    }, 
                   "@version" => "1", 
                   "@timestamp" => "2017-01-20T18:56:32.608Z", 
                    "host" => "d5b81003f43b", 
    "\"int0\", \"int1\", \"int2\", \"int3\", \"int4\", \"int5\", \"int6\"" => "0" 
} 

Чтобы получить эту работу, мы должны использовать кучу различных фильтров мутировать:

filter { 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int0" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int1" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int2" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int3" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int4" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int5" } } 
    mutate { rename => { "[Mot_Temp_Test][INT][0]" => "int6" } } 
} 

И успех:

{ 
    "Mot_Temp_Test" => { 
     "INT" => [ 
      [0] "7", 
      [1] "8", 
      [2] "9", 
      [3] "10", 
      [4] "11" 
     ] 
    }, 
     "@version" => "1", 
     "@timestamp" => "2017-01-20T18:21:06.488Z", 
      "host" => "882832d1dd43", 
      "int0" => "0", 
      "int1" => "1", 
      "int2" => "2", 
      "int3" => "3", 
      "int4" => "4", 
      "int5" => "5", 
      "int6" => "6" 
} 

В общем, массивы являются то, что logstash не годится.

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