2016-10-06 2 views
1

Я пытаюсь использовать Logstash и ElasticSearch для мониторинга активности моего веб-сервера Apache. На данный момент это работает очень хорошо, но мне нужно более конкретную информацию о моем поле запроса. В это время моя конфигурация logstash является:Logstash: get URL params в hash

filter { 
    grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } 
    grok { match => { "request" => [ "url", "%{URIPATH:url_path}%{URIPARAM:url_params}?" ]} } 
    urldecode{ field => "url_path" } 
    mutate { gsub => ["url_params","\?","" ] } 
    kv { 
    field_split => "&" 
    source => "url_params" 
    prefix => "url_param_" 
    } 
    date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } 
    geoip { source => "clientip" } 
    useragent { source => "agent" } 
} 

Принимая основной журнал апачский:

255.254.230.10 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/boreal%3A123456/status.php?pretty=true&test=boreal%3A12345 HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0" 

В результате этой первой конфигурации является:

{ 
     "message" => "255.254.230.10 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/boreal%3A123456/status.php?pretty=true&test=boreal:%3A12345 HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"", 
     "@version" => "1", 
     "@timestamp" => "2013-12-11T08:01:45.000Z", 
      ... 
     "request" => "/xampp/boreal%3A123456/status.php?pretty=true&test=boreal%3A12345", 
     "url_path" => "/xampp/boreal:123456/status.php", 
     "url_params" => "pretty=true&test=boreal%3A12345", 
"url_param_pretty" => "true", 
    "url_param_test" => "boreal%3A12345", 
      ...  
} 

И (в воображаемом мире), Хотел бы иметь этот ответ для URL-адресов:

{ 
     ... 
     "request" => "/xampp/boreal%3A123456/status.php?pretty=true&test=boreal%3A12345", 
     "url_path" => "/xampp/boreal:123456/status.php", 
     "url_params" => { 
       "pretty" => "true", 
     "url_param_test" => "boreal:12345" 
     }, 
      ...  
} 

Мои whishes

  • url_params стать хэш-массив.
  • каждый ключ этого хеша будет имя парам
  • каждое соответствующее значение будет значение urldecode

Вопросы

  • ли мне нужно создать свой собственный плагин (Я еще не знаком с рубином)?
  • Есть ли существующий плагин (я не нашел ... может быть, плохой поиск)?
  • Это способ сделать это без плагина?

Спасибо за вашу помощь (и простите за мой английский)

Renaud

Решение:

Благодаря Валу, он нашел решение. Я изменил свою конфигурацию:

grok { match => { "request" => [ "url", "%{URIPATH:url_path}%{URIPARAM:url_params}?" ]} } 
urldecode{ field => "url_path" } 
mutate { gsub => ["url_params","\?","" ] } 
kv { 
    field_split => "&" 
    source => "url_params" 
    target => "url_params_hash" 
} 
urldecode{ field => "url_params_hash" } 

Используя это решение, даже если «&» (% 26) символов находятся в url_params строки расщепление является правильным.

ответ

1

Вы почти делаете это правильно, используя фильтр kv. Вам нужно немного изменить конфигурацию.

Кроме того, необходимо добавить еще один urldecode фильтр для url_params только после того, как другой для пути

urldecode{ field => "url_path" } 
urldecode{ field => "url_params" } 
mutate { gsub => ["url_params","\?","" ] } 
kv { 
    field_split => "&" 
    source => "url_params" 
    target => "url_params_hash" 
} 

Вы получите что-то вроде этого:

{ 
     "message" => "255.254.230.10 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/boreal%3A123456/status.php?pretty=true&test=boreal:%3A12345 HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"", 
     "@version" => "1", 
    "@timestamp" => "2013-12-11T08:01:45.000Z", 
"url_params_hash" => { 
     "pretty" => "true", 
      "test" => "boreal:12345" 
    } 
} 
+0

Да! Это работает очень хорошо. Большое спасибо. Я изменил порядок или urldecode: url-код в поле «url_params» выполняется после фильтра «kv». Выполнение этого, без проблем, если «&» (% 26) находится в строке params. –

+0

Удивительный, рад, что это помогло! – Val

+0

Обратите внимание, что вы должны изменить свой вопрос вместо моего ответа :) – Val

Смежные вопросы