Фильтр 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 \[).*?(?=\])

аналогичным образом сделайте то же самое для ответного сообщения.

Другие вопросы по тегам