Grok过滤器(正则表达式)用于提取方括号内的字符串。

3

以下是我的应用程序日志条目:

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过滤器来提取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?"(?<clienttoken>(Received response message \[(.*?)\]))" - Avinash Raj
1个回答

3
你可以使用回顾断言和预测断言。
(?<=Sent request message \[).*?(?=\])

同样地,对于响应消息也要做同样的处理。

1
有没有人有一个完整的grok语法匹配这个(带字段名)的例子?我似乎在我的自定义匹配模式中嵌套我的前瞻/后顾时遇到了问题。例如(?<field_to_match>(?<=lookbehindregex).+?(?=lookaheadregex)) - 这是正确的方法吗? - Toby
1
@Toby 你解决了吗?我也遇到了同样的问题。我的正向预查和反向预查在 REGEX 工具中可以工作,但在 logstash 中失败了。 - AgentX
@AgentX 我没有。我在 Stack Overflow 上提出了这个问题,但没有得到答案。 - Toby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接