Logstash делает копию вложенного поля с помощью mutate.добавить поле
Я хотел сделать копию вложенного поля в фильтре Logstash, но я не могу выяснить, правильный синтаксис. Вот что я пытаюсь:
неправильный синтаксис:
mutate {
add_field => { "received_from" => %{beat.hostname} }
}
бить.имя хоста не заменяется
mutate {
add_field => { "received_from" => "%{beat.hostname}" }
}
бить.имя хоста не заменяется
mutate {
add_field => { "received_from" => "%{[beat][hostname]}" }
}
бить.имя хоста не заменяется
mutate {
add_field => { "received_from" => "%[beat][hostname]" }
}
низзя. Если я даю не вложенное поле, оно работает так, как ожидалось.
структура данных, полученная logstash, является следующий:
{
"@timestamp" => "2016-08-24T13:01:28.369Z",
"beat" => {
"hostname" => "etg-dbs-master-tmp",
"name" => "etg-dbs-master-tmp"
},
"count" => 1,
"fs" => {
"device_name" => "/dev/vdb",
"total" => 5150212096,
"used" => 99287040,
"used_p" => 0.02,
"free" => 5050925056,
"avail" => 4765712384,
"files" => 327680,
"free_files" => 326476,
"mount_point" => "/opt/ws-etg/datas"
},
"type" => "filesystem",
"@version" => "1",
"tags" => [
[0] "topbeat"
],
"received_at" => "2016-08-24T13:01:28.369Z",
"received_from" => "%[beat][hostname]"
}
1 ответов
EDIT:
так как вы не показали свое входное сообщение, я отработал ваш выход. В вашем выводе поле, в которое вы пытаетесь скопировать, уже существует, поэтому вам нужно использовать replace. Если он не существует, вам действительно нужно использовать add_field. Я обновил свой ответ для обоих случаев.
EDIT 2: я понял, что ваша проблема может заключаться в доступе к вложенному значению, поэтому я добавил Это:)
вы используете мутирующий фильтр неправильно / назад.
первая ошибка:
вы хотите заменить поле, а не добавить. В документах он дает вам опцию "заменить". Смотрите: https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-replace
Вторая ошибка, вы используете синтаксис в обратном. Кажется, вы верите, что это правда:
"text I want to write" => "Field I want to write it in"
а это правда:
"myDestinationFieldName" => "My Value to be in the field"
С этим знанием, мы можем теперь сделать это:
mutate {
replace => { "[test][a]" => "%{s}"}
}
или если вы хотите добавить новое не существующее поле:
mutate {
add_field => {"[test][myNewField]" => "%{s}"}
}
или добавьте новое существующее поле со значением вложенного поля:
mutate {
add_field => {"some" => "%{[test][a]}"}
}
или более подробно, в моем примере:
input {
stdin {
}
}
filter {
json {
source => "message"
}
mutate {
replace => { "[test][a]" => "%{s}"}
add_field => {"[test][myNewField]" => "%{s}"}
add_field => {"some" => "%{[test][a]}"}
}
}
output {
stdout { codec => rubydebug }
}
этот пример использует stdin и выводит в stdout. Он использует фильтр json для анализа сообщения, а затем мутирующий фильтр для замены вложенного поля. Я также добавляю совершенно новое поле во вложенный тестовый объект. И, наконец, создает новое поле "некоторые", которое имеет значение test.а
Итак, для этого сообщения:
{"test" : { "a": "hello"}, "s" : "to_Repalce"}
мы хотим заменить тест.a (значение: "Hello") с s (значение: "to_Repalce") и добавьте полевой тест.myNewField со значением s.
на мой терминал:
artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started
{"test" : { "a": "hello"}, "s" : "to_Repalce"}
{
"message" => "{\"test\" : { \"a\": \"hello\"}, \"s\" : \"to_Repalce\"}",
"@version" => "1",
"@timestamp" => "2016-08-24T14:39:52.002Z",
"host" => "pandaadb",
"test" => {
"a" => "to_Repalce",
"myNewField" => "to_Repalce"
},
"s" => "to_Repalce"
"some" => "to_Repalce"
}
значение успешно заменено.
добавлено поле "некоторые" со значением replaces
добавлено новое поле во вложенном массиве.
если вы используете add_field, он преобразует a в массив и добавит туда ваше значение.
надеюсь, это решит вашу проблему,
Артур