Использование Grok отфильтровывает UUID из строки пути и пути возврата - PullRequest
2 голосов
/ 10 июля 2020

Вот пример строки журнала, который я пытаюсь отфильтровать:

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, но запрос возвращается как 2 отдельных значения.

%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request}%{UUID:uuid}%{NOTSPACE:request}

1 Ответ

1 голос
/ 10 июля 2020

Вы можете объединить части до и после 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 позже, если вы sh тоже.

Если вы не можете использовать 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*)

потому что нельзя сопоставить две непересекающиеся строки текста в одну группу захвата .

...