Logstash - найти длину результата разделения внутри mutate

Я новичок в Logstash. Сейчас я пытаюсь разобрать журнал в формате CSV. Мне нужно разделить поле с помощью разделителя пробелов, затем я добавлю новые поля на основе результата разделения.

Вот фильтр, который мне нужно создать:

filter {
...
mutate {
    split => ["user", " "]
    if [user.length] == 2 {
        add_field => { "sourceUsername" => "%{user[0]}" }
        add_field => { "sourceAddress" => "%{user[1]}" }
    }
    else if [user.length] == 1 {
        add_field => { "sourceAddress" => "%{user[0]}" }
    }
}
...
}

Я получил ошибку после if скрипта. Пожалуйста, посоветуйте, есть ли способ зафиксировать длину результата разделения внутри плагина mutate.

Спасибо, Хери


person Herry    schedule 25.09.2015    source источник


Ответы (1)


В соответствии с вашим примером кода я полагаю, что вы закончили синтаксический анализ csv и у вас уже есть поле user, которое имеет либо значение, содержащее sourceAddress, либо значение, содержащее sourceUsername sourceAddress (разделенное пробелом).

Теперь есть множество фильтров, которые можно используется для получения дополнительных полей. Вам не нужно использовать фильтр mutate для разделения поля. В этом случае более гибким подходом был бы фильтр grok.

Фильтр:

grok {
    match => {
        "user" => [ 
            "%{WORD:sourceUsername} %{IP:sourceAddress}",
            "%{WORD:sourceUsername}"
            ]
    }
}

Поле "user" => "192.168.0.99" приведет к

"sourceAddress" => "191.168.0.99".

Поле "user" => "Herry 192.168.0.99" приведет к

"sourceUsername" => "Herry", "sourceAddress" => "191.168.0.99"

Конечно, вы можете изменить IP на WORD, если ваш sourceAddress не является IP.

person hurb    schedule 30.09.2015