Я не знаю, как добиться этого, используя исключительно шаблоны 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