Добавить данные в динамический вложенный хэш в logstash
Я хочу поместить значение в часть вложенного хэша, но назовите эту часть в зависимости от восходящих фильтров. Это необходимо для рефакторинга и уменьшения общего размера кода, поскольку в настоящее время каждый из 20+ типов входящих событий имеет свой собственный раздел, подобный этому, с 18 строками в файле logstash (но в настоящее время бит%{detail_part} жестко задан).
# Working code
filter {
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][OtherThing][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][OtherThing][MoreDetail]" => "false"
}
}
}
}
Выше это жестко закодировано в "OtherThing". Ниже есть переменная, но не работает.
# Non-Working code
filter {
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][%{detail_part}][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][%{detail_part}][MoreDetail]" => "false"
}
}
}
}
В приведенном выше (нерабочий код) detail_part устанавливается в восходящем фильтре на строковое значение, например "OtherThing". В настоящее время он компилируется и запускается, но из него не выводится XML, поэтому я не думаю, что в результате этих операторов что-либо будет добавлено в хеш.
Я знаю, что это можно сделать с помощью встроенного кода Ruby, но я бы хотел, чтобы это было как можно проще. Результатом этого процесса будет XML, поэтому я вынужден использовать этот тип вложенного хэша.
Это возможно с Logstash?
1 ответ
Оказывается, да, Logstash поддерживает это, просто синтаксис был неправильным. Итак, вот исправление:
filter {
# This field could be set conditionally in an if statement ...
mutate { add_field => { "[detail_part]" => "Result" } }
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][%{[detail_part]}][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][%{[detail_part]}][MoreDetail]" => "false"
}
}
}
}
Я просто не смог найти никаких нетривиальных примеров, которые бы делали подобные вещи.