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 将其删除,这就是为什么我的示例不适用于所有人。
我在 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 将其删除,这就是为什么我的示例不适用于所有人。