(Эти результаты тестов я побежал, используя 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 не годится.
Вам нужен другой документ для каждого элемента массива или другое поле для каждого элемента массива в одном документе? –
Я хочу другое поле для каждого элемента массива –
[Это] (https://discuss.elastic.co/t/how-to-split-array-without-a-target/1590/2) может быть полезным и все еще похоже, проблема! – Kulasangar