обработки grok фильтрами в Logstash.
Кейс следующий: множество сервисов посылает различного рода логи в Logstah с помощью Filebeat, в Logstash пайплайне определяется тип сервиса и на основании этого, к лог-лайну применяются grok фильтры, например:
filter {
if "api_access" in [service_name] {
grok {
match => { "message" => \[%{DATA:IP_address}\]\[%{DATA:User_ID}\]" }
}
grok {
match => { "message" => "\[%{DATA:IP_address}\]\[%{DATA:User_ID}\]\[%{DATA:Session_ID}\]" }
}
grok {
match => { "message" => "\[%{DATA:IP_address}\]\[%{DATA:User_ID}\]\[%{DATA:Session_ID}\]\[%{DATA:loglevel}\] ExecutionTime = %{NUMBER:exec_time}" }
}
grok {
match => { "message" => "\[%{DATA:IP_address}\]\[%{DATA:User_ID}\]\[%{DATA:Session_ID}\]\[%{DATA:loglevel}\]\[%{DATA:category}\](?<log_message>%{GREEDYDATA})" }
}
}
else if {check other services}
}
Примеры немного урезаны чтобы повысить читаемость.
Идея была такова: последний Grok фильтр является общим, т.е. он применится в последнюю очередь и всё равно обработает лог даже если предыдущие фильтры не подошли.
Как я понимаю, проблема в том, что к сообщению поочередно применятся каждый grok фильтр, в конечном итоге у меня несколько одинаковых значений в IP_address, User_ID, Session_ID, loglevel и т.д.
Пробовал использовать break_on_match с true/false, но результат идентичный, данные дуплицированы.
Подскажите пожалуйста, как это можно исправить сохранив при этом идею множества Grok фильтров?
Спасибо.
Для потомков так сказать: Решил кейс, необходимо было правильно установить порядок Grok фильтров и заключить их в if условия с проверкой на наличие _grokparsefailure in [tags], т.е. если есть проблема с парсингом -> двигаемся дальше по условию, если нет, оставляем последнее отфильтрованное сообщение
Также добавлю, что можно обойтись и другим методом, более быстрым, распарсив логлайн сначала жадным Grok фильтром через {GREEDYDATA:log_message} например и затем уже обрабатывать данные из log_message в последующих Grok фильтрах.
Обсуждают сегодня