Получение параметров RESTful GET в logstash

Я пытаюсь получить logstash для анализа пар ключ-значение в HTTP-запросе на получение из моих файлов журнала ELB.

поле запроса выглядит как http://aaa.bbb/get?a=1&b=2

Я бы хотел, чтобы в строке журнала выше было поле для a и b, и у меня возникли проблемы с его пониманием.

Ниже приведен мой файл logstash conf (отформатированный для ясности), который не загружает никаких дополнительных ключевых полей. Я предполагаю, что мне нужно отделить адресную часть URI, но я этого не понял.

input {
    file {
        path => "/home/ubuntu/logs/**/*.log"
        type => "elb"
        start_position => "beginning"
        sincedb_path => "log_sincedb"
    }
}
filter {
    if [type] == "elb" {
        grok {
            match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} 
%{NOTSPACE:loadbalancer} %{IP:client_ip}:%{NUMBER:client_port:int}
%{IP:backend_ip}:%{NUMBER:backend_port:int} 
%{NUMBER:request_processing_time:float}
%{NUMBER:backend_processing_time:float} 
%{NUMBER:response_processing_time:float} 
%{NUMBER:elb_status_code:int}
%{NUMBER:backend_status_code:int} 
%{NUMBER:received_bytes:int} %{NUMBER:sent_bytes:int} 
%{QS:request}" ]
        }
        date {
            match => [ "timestamp", "ISO8601" ]
        }
        kv {
            field_split => "&?"
            source => "request"
            exclude_keys => ["callback"]
        }
    }
}


output {
    elasticsearch { host => localhost }
}

person Tony Laidig    schedule 06.08.2015    source источник
comment
Создает ли фильтр grok {} поле request? Что в нем?   -  person Alain Collins    schedule 06.08.2015
comment
Да, самая последняя часть поля grok - это %{QS:request}. Это URL-адрес, указанный в вопросе.   -  person Tony Laidig    schedule 06.08.2015


Ответы (1)


kv займет URL-адрес и разделите параметры. Этот конфиг работает:

input {
    stdin { }
}

filter {
    mutate {
            add_field => { "request" => "http://aaa.bbb/get?a=1&b=2" }
    }

    kv {
            field_split => "&?"
            source => "request"
    }
}

output {
    stdout {
            codec => rubydebug
    }
}

stdout показывает:

{
   "request" => "http://aaa.bbb/get?a=1&b=2",
         "a" => "1",
         "b" => "2"
}

Тем не менее, я бы посоветовал вам создать свои собственные версии шаблонов URI по умолчанию, чтобы они задавали поля. Затем вы можете передать поле запроса в kv. Так чище.

ОБНОВИТЬ:

Что касается «создания собственных шаблонов», я имел в виду взять существующие и изменить их по мере необходимости. В logstash 1.4 установить их было так же просто, как поместить их в новый файл, каталог «patterns»; Я пока не знаю паттернов для> 1.4.

MY_URIPATHPARAM %{URIPATH}(?:%{URIPARAM:myuriparams})?
MY_URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{MY_URIPATHPARAM})?

Затем вы можете использовать MY_URI в своем шаблоне grok {}, и он создаст поле под названием myuriparams, которое вы можете передать в kv {}.

person Alain Collins    schedule 06.08.2015
comment
Спасибо! Когда вы говорите создать свои собственные версии шаблонов URI по умолчанию, на какую функцию / фильтр мне следует обратить внимание? - person Tony Laidig; 06.08.2015
comment
Кроме того, была не связанная с этим причина, по которой я не видел значения правильно. Кибана смотрел не на тот указатель. {facepalm}. - person Tony Laidig; 06.08.2015