(Logstash, Grok) если поле содержит конкретное слово, то сохранить из него некоторые символы

У меня есть следующий фильтр, который удовлетворяет большинство моих потребностей:

filter {
grok {
    match => { "message" => [ "%{IPORHOST:clientip} - %{NGUSER:user} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) (-|(%{DATA:referrer})) ] }

Однако некоторые (не все) журналы, которые я анализирую, содержат имя канала, который пользователь использует на моем сервере Apache.

Обычный журнал, включающий слово «канал», будет выглядеть так:


10.40.80.11 - [email protected] [03/янв/2014:13:08:21 +0000] "GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-01-03 HTTP/1.1" 200 368 "http://example.net/cgi-bin/feed/epg" "Мозилла/5.0"


Поле «rawrequest» сохраняется в отдельном поле, например:

"GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-04-04 HTTP/1.1"

Вопрос: Как сохранить названия каналов в отдельном поле, ведь не во всех логах в поле «rawrequest» есть слово «канал»?

Я видел много примеров, но ничего подобного. Символ, отделяющий канал от остальной части строки, - "&". Буду признателен за любую помощь.

Решение:

match => { "request" => [ "channel=(?<Channels>[^&]+)" ] }

person Edgar    schedule 10.10.2016    source источник
comment
Для тех, кто хочет сделать что-то подобное, я разместил свою конфу в своем посте.   -  person Edgar    schedule 12.10.2016


Ответы (1)


Вы существующий грок создает поля. Вы можете создать дополнительные поля из тех полей, используя другой grok. Регулярное выражение вроде

channel=(?<myField>[^&]+)

должно работать, поэтому ваш грок может выглядеть так (непроверенный):

grok {
    match => { "request" => [ "channel=(?<myField>[^&]+)" ] }
}

Это сделает вас новым полем под названием «myField». Переименуйте по желанию.

Другим вариантом было бы изменить исходный шаблон grok, используя более конкретные встроенные шаблоны, а не NOTSPACE. Проверьте шаблон URI. К сожалению, этот шаблон не создает полей за вас, поэтому вам придется изменить его. Если вы поместите информацию URIPATHPARAM в другое поле, вы можете использовать фильтр kv{} и разобрать все пары в свои собственные поля.

Много вариантов...

person Alain Collins    schedule 10.10.2016
comment
Спасибо за ваш ответ. Я новичок в Logstash. Не могли бы вы уточнить, где именно я должен разместить эту строку? - person Edgar; 11.10.2016