Как извлечь значения в полях в квадратных скобках в журнале json - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок ie в использовании logsta sh, и мне нужна помощь со следующим json форматом журнала:

{
"field1" :[
{
"sub_field1": {
"sub_field2":"value X"
"sub_field3": {"sub_field4":"value Y"}

}
"sub_field5":"value W"
}
]
}

Я хочу знать, как получить значение X, Значение Y и значение W с помощью mutate: «Add_field».

Заранее спасибо!

1 Ответ

0 голосов
/ 17 февраля 2020

Предполагая, что у вас будет только один элемент массива под 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 или что-то в этом роде. И если у вас есть более одного элемента, который вам нужно выплюнуть, вам нужно будет использовать стратегию, которая обсуждается в комментариях здесь: { ссылка }

...