Я постараюсь объяснить, чего я хочу добиться. У меня есть шаблон grok, соответствующий простой строке журнала. В строке журнала есть тело ответного сообщения json, и я могу проанализировать его с помощью пользовательского шаблона регулярного выражения, и я вижу его на панели инструментов kibana, как и ожидалось. Дело в том, что я хотел бы извлечь некоторые данные из самого тела.
Вот рабочий шаблон грока:
{TIMESTAMP_ISO8601:timestamp}%{SPACE}*%{LOGLEVEL:level}:%{SPACE}*%{DATA}%{BODY:body}
Пользовательский шаблон для ТЕЛА:
BODY (Body:.* \{.*})
И я вижу, что он анализируется с помощью отладчика grok:
{
"timestamp": "2022-11-04 17:09:28.052",
"level": "INFO",
"body": {\"status\":200,\"page\":1, \"fieldToBeParsed\":12 .....//more json conten}
}
Есть ли способ разобрать часть содержимого тела вместе со всем телом. Итак, я могу получить результат, похожий на:
{
"timestamp": "2022-11-04 17:09:28.052",
"level": "INFO",
"body": {\"status\":200,\"page\":1, \"fieldToBeParsed\":12 .....//more json conten},
"parsedFromBody: 12
}
Пример:
{TIMESTAMP_ISO8601:timestamp}%{SPACE}*%{LOGLEVEL:level}:%{SPACE}*%{DATA}%{BODY:body}%
{FROMBODY:frombody}%
Спасибо!
После того, как вы использовали grok для анализа поля, вы можете использовать второй фильтр grok для анализа полей, созданных первым grok. Не пытайтесь сделать и то, и другое в одном гроке, это может сработать, а может и не сработать. Совпадения представляют собой хеш, а хэши Java не упорядочены.
grok { match => { "body" => "fieldToBeParsed\":%{NUMBER:someField:int}" } }