Как использовать условие IF ELSE в шаблоне grok в logstash - PullRequest
0 голосов
/ 16 января 2019

У меня объединены веб-журнал и API-журнал, и я хочу сохранить его отдельно вasticsearch. Поэтому я хочу написать один шаблон, если запрос для API, тогда, если должен выполняться прошлый, запрос является веб, тогда должна быть выполнена другая часть журнала.

Ниже приведено несколько журналов веб-страниц и API.

00:06:27,778 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.777 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() started to get widget details.
00:06:27,783 INFO  [stdout] (ajp--0.0.0.0-8009-38) ---> HTTP GET http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true
00:06:27,817 INFO  [stdout] (ajp--0.0.0.0-8009-38) <--- HTTP 200 http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true (29ms)
00:06:27,822 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.822 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() finished.
00:06:27,899 INFO  [stdout] (ajp--0.0.0.0-8009-40) 00:06:27.899 [ajp--0.0.0.0-8009-40] INFO  c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController

Я пытался написать условие, но оно не работает. Это работает только до имени потока. После потока у меня есть журнал нескольких типов, поэтому я не могу писать без условия.

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)

Кто-нибудь может дать мне предложение?

1 Ответ

0 голосов
/ 16 января 2019

Для этого не нужно использовать условие if/else, вы можете использовать несколько шаблонов, один из которых будет соответствовать строкам журнала API, а другой будет соответствовать строкам веб-журнала.

Для строк журнала API вы можете использовать следующий шаблон:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}(?:%{DATA})%{SPACE}\[%{DATA}\]%{SPACE}%{WORD}%{SPACE}%{GREEDYDATA:MSG}

И ваше возвращение будет примерно таким:

{
"MSG": "c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController",
"CREATED_ON": "00:06:27,899",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-40"
}

Для веб-линий вы можете использовать следующий шаблон:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\(%{NOTSPACE:THREAD}\)%{SPACE}%{DATA}%{WORD:PROTOCOL}%{SPACE}%{WORD:MethodOrStatus}%{SPACE}%{GREEDYDATA:ENDPOINT}

И результат будет:

{
"CREATED_ON": "00:06:27,783",
"PROTOCOL": "HTTP",
"ENDPOINT": "http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-38",
"MethodOrStatus": "GET"
}

Чтобы использовать несколько паттернов в Grok, просто сделайте это:

grok {
  match => ["message", "pattern1", "pattern2"]
}

Или вы можете сохранить ваши шаблоны в файл и использовать patterns_dir, чтобы указать на каталог файла.

Если вы все еще хотите использовать условное выражение, просто проверьте что-либо в сообщении, например:

if "HTTP" in [message] { 
 grok { your grok for the web messages }
} else {
 grok { your grok for the api messages }
}
...