Использование Grok отфильтровывает UUID из строки пути и пути возврата
Вот пример строки журнала, которую я пытаюсь фильтровать:
Request starting HTTP/1.1 GET http://api0.api.sin/api/social/v1/owner/4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf/feeds/notifications/unread/count
Результат, который я ожидаю, будет следующим:
{
"message": [
[
"Request starting"
]
],
"httpversion": [
[
"1.1"
]
],
"BASE10NUM": [
[
"1.1"
]
],
"verb": [
[
"GET"
]
],
"request": [
[
"http://api0.api.sin/api/social/v1/owner/feeds/notifications/unread/count"
]
],
"uuid": [
[
"4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf"
]
]
}
Я пробовал использовать следующее выражение grok, но запрос возвращается как два отдельных значения.
%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request}%{UUID:uuid}%{NOTSPACE:request}
1 ответ
Решение
Вы можете записать части до и после UUID в отдельные группы, а затем вы можете объединить два значения в одно поле:
grok {
match => {
"message" => "%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request1}/%{UUID:uuid}%{NOTSPACE:request2}"
}
}
mutate {
add_field => {
"request" => "%{request1}%{request2}"
}
}
Вы можете бросить request1
а также request2
позже, если хотите, тоже.
Если вы не можете использовать mutate
, вы можете придумать только выражение, где request
включает UUID:
%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} (?<request>.*?(?<UUID>[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})\S*)
потому что нельзя сопоставить две непересекающиеся строки текста в одну группу захвата.