Добавить данные в динамический вложенный хэш в 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"
            }
        }
    }
}

Я просто не смог найти никаких нетривиальных примеров, которые бы делали подобные вещи.

Другие вопросы по тегам