Фильтр Grok (регулярное выражение) для извлечения строки в квадратных скобках
Записи моего журнала приложений приведены ниже:
2015-06-24 14:03:16.7288 Sent request message [649b85fa-bfa0-4cb4-8c38-1aeacd1cbf74] <Request>sometext</Request>
2015-06-24 14:38:05.2460 Received response message [649b85fa-bfa0-4cb4-8c38-1aeacd1cbf74] <Response>sometext</Response>
Я использую logstash grok filter для извлечения содержимого XML и токена клиента с квадратной скобкой.
grok {
match => ["message", "(?<content>(<Request(.)*?</Request>))"]
match => ["message", "(?<clienttoken>(Sent request message \[(.)*?\]))"]
add_tag => "Request"
break_on_match => false
tag_on_failure => [ ]
}
grok {
match => ["message", "(?<content>(<Response(.)*?</Response>))"]
match => ["message", "(?<clienttoken>(Received response message \[(.)*?\]))"]
add_tag => "Response"
break_on_match => false
tag_on_failure => [ ]
}
Теперь результат выглядит ниже
Для первой строки журнала:
Content = <Request>sometext</Request>
clienttoken = Sent request message [649b85fa-bfa0-4cb4-8c38-1aeacd1cbf74]
Для второй строки журнала:
Content = <Response>sometext</Response>
clienttoken = Received response message [649b85fa-bfa0-4cb4-8c38-1aeacd1cbf74]
Но я хочу, чтобы результат был таким:
Content = <Request>sometext</Request>
clienttoken = 649b85fa-bfa0-4cb4-8c38-1aeacd1cbf74
Пожалуйста, дайте мне знать, как извлечь только строки в квадратной скобке без всех соответствующих строк в шаблоне.
1 ответ
Решение
Вы можете использовать утверждения lookbehind и lookahead.
(?<=Sent request message \[).*?(?=\])
аналогичным образом сделайте то же самое для ответного сообщения.