Как я могу извлечь значение ключевого слова из строки

Я использую этот инструмент https://grokdebug.herokuapp.com/ для тестирования анализатора grok. Исходная строка, которую я имею, выглядит примерно так:

2020-05-01 01:59:10 server1 17.5.36.8 POST /v1/user.aspx r=1000&11:59:11.219&Method=Start&Credentials=xxxxxx:++http://localhost/v1/user.aspx&Reque

Я хотел бы проанализировать данные для:

{
Method: Start,
r: 1000
Credential: xxxxx
}

Я смотрю парсер https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns, но я не могу найти подходящий для использования.


person Joey Yi Zhao    schedule 25.05.2020    source источник


Ответы (1)


Я не знаю, как добиться этого, используя исключительно шаблоны grok. Если вы также используете Logstash, вы можете попробовать следующее решение:

Шаблон:

%{TIMESTAMP_ISO8601:timestamp}\s%{GREEDYDATA:server}\s%{IP:ip}\s%{GREEDYDATA:request_type}\s%{PATH:path}\sr=%{NUMBER:r}&%{TIME:some_time}&Method=%{GREEDYDATA:method}&Credentials=%{GREEDYDATA:username}:%{GREEDYDATA:password}%{MY_URI:uri}

Он работает с пользовательским шаблоном. :

MY_URI http://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?

Я использовал пользовательский шаблон, потому что %{URIPROTO} из исходного шаблона %{URI} не будет правильно отделять учетные данные от uri. Я предположил, что учетные данные даются в следующем формате:

username:password

Если я ошибаюсь, замените:

Credentials=%{GREEDYDATA:username}:%{GREEDYDATA:password}

с:

Credentials=%{GREEDYDATA:credentials}

Если строка :++ отделяет учетные данные от uri, вы можете использовать ее для применения %{URI} вместо %{MY_URI}.

Шаблон работает в отладчике Grok. Однако вывод более удобочитаем в Grok Constructor Matcher.

Поскольку вас интересуют только некоторые поля, используйте поле remove_field. Используйте add_field плагин для заключения результата в новое поле.

Ваш файл logstash.conf может выглядеть так (если вы поместите файл с пользовательским шаблоном в каталог patterns рядом с файлом конфигурации):

# logstash.conf
…
filter {
    grok {
        patterns_dir => ["./patterns"]
        match => {
            "message" => "%{TIMESTAMP_ISO8601:timestamp}\s%{GREEDYDATA:server}\s%{IP:ip}\s%{GREEDYDATA:request_type}\s%{PATH:path}\sr=%{NUMBER:r}&%{TIME:some_time}&Method=%{GREEDYDATA:method}&Credentials=%{GREEDYDATA:username}:%{GREEDYDATA:password}%{MY_URI:uri}"
        }
    mutate {
            add_field => { "result" => "Method: %{method}, r: %{r} Credential: %{username}}
            remove_field => ["timestamp", "server", "ip", "request_type", "path", "some_time", "password", "uri", "method", "r", "username"]
        }
    }
…
person little_pinecone    schedule 26.05.2020