Предполагая, что у вас будет только один элемент массива под field1
, это просто:
add_field => {
sub_field1 => '%{[field1][0][sub_field1]}'
sub_field2 => '%{[field1][0][sub_field1][sub_field2]}'
...
}
Хороший способ проверить это - создать файл с именем test.json
{ "field1" :[ { "sub_field1": { "sub_field2":"value X","sub_field3": {"sub_field4":"value Y"} }, "sub_field5":"value W" } ] }
Создайте файл конфигурации, например test.conf
:
{
stdin { codec => 'json_lines' }
}
filter {
mutate {
add_field => {
sub_field1 => '%{[field1][0][sub_field1]}'
sub_field2 => '%{[field1][0][sub_field1][sub_field2]}'
}
}
}
output {
stdout { codec => "rubydebug" }
}
И затем запустите его: cat test.json | bin/logstash -f test.conf
Вы получите такой вывод:
{
"field1" => [
[0] {
"sub_field5" => "value W",
"sub_field1" => {
"sub_field3" => {
"sub_field4" => "value Y"
},
"sub_field2" => "value X"
}
}
],
"@timestamp" => 2020-02-17T17:26:59.471Z,
"@version" => "1",
"host" => "xxxxxxxx",
"sub_field2" => "value X",
"sub_field1" => "{\"sub_field3\":{\"sub_field4\":\"value Y\"},\"sub_field2\":\"value X\"}",
"tags" => []
}
Который показывает sub_field2
и sub_field1
.
Если вы не предсказывает имена полей, вам придется прибегнуть к фильтру ruby или что-то в этом роде. И если у вас есть более одного элемента, который вам нужно выплюнуть, вам нужно будет использовать стратегию, которая обсуждается в комментариях здесь: { ссылка }