#logstash #logstash-grok
#logstash #logstash-grok
Вопрос:
Мои строки файла журнала выглядят так, как показано ниже.
[2020-07-10T10:00:04.979 00:00] [app_server1] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user10.id2] start-getchunk: Report=/Report Folder Path/Report name, TemplateName=Template1004, OutFormat=excel, Locale=en_US
[2020-07-10T10:00:25.085 00:00] [app_server2] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user1.id1] end-getchunk: Report=/Report Folder Path/Report name, TemplateName=Template2007, OutFormat=html, Locale=en_US
[2020-07-10T10:00:25.080 00:00] [app_server2] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user2.id1][
Start report processing details
-----------------------------------------------------
Report path: /Report Folder Path/Report name
Datamodel name: /Report Folder Path/Datamodel name
User name: user2
Output format: 1
chunk size limit: 524288000
-----------------------------------------------------
End report processing details
]
[Log lines with some other patterns]
Я хочу, чтобы в моем файле конфигурации logstash были указаны следующие типы шаблонов соответствия, чтобы соответствовать разным строкам.
(a) match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
(b) match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
(c) to match a multiline having this match
break_on_match => false
match => {
"message => [
"Report path: (?<report_path>[^,rn]*)",
"Datamodel name: (?<datamodel_name>[^,rn]*)",
"User name: (?<user_name>[^,rn]*)",
(?<event_type>Start report processing details)
]
}
(d) other n numbers of matches like the one mentioned in points (a) amp; (b) above
Пока давайте предположим, что у меня есть только (a), (b) amp; (c) в моей конфигурации.
Моя конфигурация выглядит аналогично приведенной ниже (с измененной последовательностью строк «match =>»).
filter{
grok{
break_on_match => false
## single grok pattern match
match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
## multple grok pattern match
match => {
"message => [
"Report path: (?<report_path>[^,rn]*)",
"Datamodel name: (?<datamodel_name>[^,rn]*)",
"User name: (?<user_name>[^,rn]*)",
(?<event_type>Start report processing details)
]
}
}
}
Теперь формулировка проблемы: —
Конфигурация соответствует шаблону только ПОСЛЕДНЕГО из трех «match =>», упомянутых в файле конфигурации.
Итак, если в файле конфигурации
[A] the sequence of "match =>" lines are (a) -> (b) -> (c) (as shown in above config): it matches patterns for only (c).
[B] the sequence of "match =>" lines are (c) -> (b) -> (a): it matches patterns for only (a).
[C] the sequence of "match =>" lines are (c) -> (a) -> (b): it matches patterns for only (b).
Но я хочу, чтобы все (a), (b), (c) были сопоставлены во входных данных.
Кроме того, я хочу сохранить шаблоны соответствия для (a), (b), (c) как есть. На самом деле, для (c) у меня был шаблон grok, подобный (a) и (b). В то время конфигурация пыталась сопоставить все (a), (b) и (c). Но из-за ошибки «_groktimeout» для (c) изменил шаблон на тот, который упоминается в (c) здесь ссылка.
Чтобы решить проблему, я попытался использовать
- несколько блоков grok {} в одном блоке filter {} И
- несколько блоков filter {} в одном файле конфигурации для решения проблемы путем разделения «(a), (b)» и «(c)» на отдельные блоки. Но в двух вышеуказанных случаях он не генерирует никаких выходных данных.
Я попробовал другой вариант, как показано ниже. Это работает, но это не самый эффективный вариант. Следовательно, ищите лучший и более производительный вариант без использования grok внутри условия «if».
filter{
grok{
## single grok pattern match
match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] [] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] (?<event_type>send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "[%{TIMESTAMP_ISO8601:process_timstamp}] [%{WORD:app_server}] [%{WORD:log_level}] %{GREEDYDATA}(?<event_type>Start report processing details)"}
if " Start report processing details" in [event_type]{
grok {
break_on_match => false
## multple grok pattern match
match => {
"message => [
"Report path: (?<report_path>[^,rn]*)",
"Datamodel name: (?<datamodel_name>[^,rn]*)",
"User name: (?<user_name>[^,rn]*)",
(?<event_type>Start report processing details)
]
}
}
}
}
}
Мой ожидаемый результат, как показано ниже, и для этого я удаляю несколько полей в моем файле конфигурации.
{"tags":["reportlog"],"userId":"user10.id2","process_timestamp":"2020-07-10T10:00:25.085 00:00","thread_type":"report-thread","template_name":"Template2007","log_level":"NOTIFICATION","event_type":"end-getchunk","output_format":"html","tid":"199163","app_server":"app_server2","report_name":"/Report Folder Path/Report name"}
{"tags":["reportlog"],"userId":"user1.id1","process_timestamp":"2020-07-10T10:00:04.979 00:00","thread_type":"report-thread","template_name":"Template1004","log_level":"NOTIFICATION","event_type":"start-getchunk","output_format":"excel","tid":"800760","app_server":"app_server1","report_name":"/Report Folder Path/Report name"}
{"tags":["multiline","reportlog"],"userId":["user2.id1"],"report_path":"/Report Folder Path/Report name", "process_timestamp":["2020-07-10T10:00:25.080 00:00"],"datamodel_name":"/Report Folder Path/Datamodel name","thread_type":"report-thread","log_level":"NOTIFICATION","event_type":"Start report processing details","tid":["812409"],"app_server":"app_server2"}
Комментарии:
1. Обновите свой вопрос примером сообщения, которое вы хотите проанализировать, и ожидаемым результатом. Не видя, как выглядит ваше сообщение, трудно понять, в чем проблема.
2. @leandrojmp, обновил вопрос. Но в основном я хочу, чтобы все три фильтра (a), (b), (c) были упомянуты для фильтрации сообщений из входного файла.
Ответ №1:
Единственное различие между вашими первыми двумя сообщениями заключается в том, что в одном есть строка start-getchunck
, а в другом — строка end-getchunck
, и вы сохраняете эту строку в одно и то же поле для обоих типов сообщений, поэтому ваши шаблоны grok a и b в основном одинаковы.
Следующий шаблон будет соответствовать этим двум типам сообщений.
[%{TIMESTAMP_ISO8601:process_timestamp}] [%{WORD:app_server}] [%{WORD:log_level}] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] %{DATA:event_type}: Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)
Вместо использования (?<event_type>sstart-getchunk):
и (?<event_type>send-getchunk):
используйте %{DATA:event_type}:
.
Для вашего многострочного журнала, поскольку вы не поделились своей input
конфигурацией, я использовал следующую конфигурацию множественного кода для воспроизведения.
codec => multiline {
pattern => "^["
negate => true
what => "previous"
}
grok
Конфигурация, которую вы используете для этого журнала, неверна.
Имея это:
grok {
match => {
"message" => [
"Report path: (?<report_path>[^,rn]*)",
"Datamodel name: (?<datamodel_name>[^,rn]*)"
]
}
}
То же самое с этой конфигурацией:
grok {
match => { "message" => "Report path: (?<report_path>[^,rn]*)" }
match => { "message" => "Datamodel name: (?<datamodel_name>[^,rn]*)" }
}
Что вам нужно, так это шаблон, который соответствует всем полям в вашем сообщении, шаблон ниже будет соответствовать вашему многострочному журналу.
[%{TIMESTAMP_ISO8601:process_timestamp}] [%{WORD:app_server}] [%{WORD:log_level}] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}]%{DATA}(?<event_type>Start report processing details)%{DATA}Report path: (?<report_path>[^,rn]*)%{DATA}Datamodel name: (?<datamodel_name>[^,rn]*)%{DATA}User name: (?<user_name>[^,rn]*)"
Кроме того, вам нужно установить break_on_match
значение true
, если в вашей строке уже было совпадение с шаблоном, нет необходимости проверять его с другим шаблоном, это только добавит больше обработки в ваш конвейер.
Следующее filter
будет соответствовать всем вашим строкам примера.
filter{
grok {
break_on_match => true
match => { "message" => "^[%{TIMESTAMP_ISO8601:process_timestamp}] [%{WORD:app_server}] [%{WORD:log_level}] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}] %{DATA:event_type}: Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "^[%{TIMESTAMP_ISO8601:process_timestamp}] [%{WORD:app_server}] [%{WORD:log_level}] [%{DATA:thread_type}] [tid: %{NUMBER:tid}] [userId: %{DATA:userId}]%{DATA}(?<event_type>Start report processing details)%{DATA}Report path: (?<report_path>[^,rn]*)%{DATA}Datamodel name: (?<datamodel_name>[^,rn]*)%{DATA}User name: (?<user_name>[^,rn]*)" }
}
}
^
В начале шаблонов нужно привязать позицию вашего сообщения, если по какой-либо причине ваше сообщение не начинается с [
, grok
даже не пытайтесь его проанализировать.
Поскольку grok
полагается на регулярное выражение, у него могут быть проблемы с производительностью, если вы все еще продолжаете получать ошибки тайм-аута, было бы лучше изменить свой подход и начать использовать условные выражения для анализа некоторых сообщений.
Вы можете попытаться проанализировать все общие поля с помощью одного grok
, сохранить разные части сообщения в другом поле и использовать условные обозначения, чтобы направить это поле на правильное grok
, это работает лучше, чем тот, grok
который пытается сопоставить все.
Комментарии:
1. Спасибо за ваш ответ. Что касается начала / конца, это может быть в одном совпадении grok, да, я знаю, что это можно сделать в одной строке. У меня только что было два из них в этом примере, чтобы указать, что у меня есть несколько совпадений grok. Что касается третьего совпадения (c), причина, по которой я сделал это таким образом, так .
2. Похоже, я сделал вопрос сложным, в то время как мой вопрос очень простой. Мои извинения за то, что сделали вопрос сложным. Позвольте мне переформатировать и написать вопрос снова.
3. Вам необходимо предоставить всю соответствующую информацию в вашем вопросе, а не связывать ее с внешним источником. Ссылка, которой вы поделились, не имеет ничего общего с заданным вами вопросом, лучше задать новый со всей соответствующей информацией.
4.Я получил несколько ссылок на то, почему фильтр работал не так, как ожидалось. Ниже приведены те. Ссылка1 Ссылка2. Для этого вопроса больше не требуется помощь.