Grok 中的正则表达式有时会捕获一个值,有时不会

Regexp in Grok sometimes catches a value sometimes not

我在 grok 中有一个代码,它捕获消息,如果它们满足给定的条件,它们就会得到一个标签。

我的问题是,有时这个过滤器在测试时起作用,有时却不起作用。有问题的正则表达式如下:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$

此行检查给定的消息是否不以给定的时间戳格式开头。换句话说:如果给定的消息不是以这个时间戳开头,那么它会得到一个标签。

您可以使用此在线应用程序自行测试:http://grokconstructor.appspot.com/do/match#result

对于这些测试值,regepx 会捕获所有符合条件的消息,因此带有 "test" 的两行以绿色突出显示:

test
2016-09-23 18:26:49,714
2016-09-23 18:26:40,244
test

然而,当输入如下所示时,它会捕获第一个日期:

2016-09-23 18:26:49,714
2016-09-23 18:26:40,244
test

我想了解这种行为背后的原因是什么,我该如何预防?

为什么不以一种合理的方式匹配时间戳?您可以像这样匹配多种日期格式:

date {
  match => [ "log_timestamp", "dd/MMM/YYYY HH:mm:ss", "dd/MMM/YYYY HH:mm:ss.SSS" ]
  timezone => "Etc/UTC"
  locale => "en-US"
}

这将匹配 23/SEP/2016 15:15:00 或 23/SEP/2016 15:15:00.123(我们在版本控制时进行了更改)

只要它不会出现在该行的其他地方,这应该几乎涵盖了您。

我想知道是什么导致了 online tester 中发生的行为,尽管我不确定它为什么会发生或它究竟遵循什么模式。 (我熟悉正则表达式,但这里没有其他内容。如果您了解更多,请随时在评论中阐明这一点。)

要复制,请将以下内容作为 "Some log lines you want to match":

所在的行
2016-09-23 18:26:49,714
2016-09-23 18:26:40,244
test

在显示 "The pattern that should match all logfile lines" 的地方,输入您的正则表达式:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$

不要乱动复选框(我不确定它们的作用,但它们都应该被选中)。

点击开始!你得到了这个结果,正如评论中提到的 revo:

要获得其他结果,请以完全相同的方式进行设置(如果您刚刚提交了正则表达式,它仍应进行设置),但将相同的正则表达式添加到显示 "If you want to use logstash's multiline filter please specify the used pattern" 的区域。

点击开始!你得到这个结果:

避免这种情况的简单方法是不使用 Logstash's multiline filter。 (至少我是这么认为的。)

似乎在某些消息的开头有一个 BOM(字节顺序标记),我可以在 Grok 中使用以下正则表达式捕获它:

^(?:\xEF\xBB\xBF).*&

我可以将此标记保留在剪贴板上,但看起来 StackOwerflow 将其删除,这就是为什么我的示例不适用于所有人。