GROK 正则表达式捕获组不匹配
GROK regex capture groups not matching
我正在尝试学习如何第一次使用 logstash 的 grok 过滤器捕获日志文件中的不同字段,但无法正确解析它。我正在使用 https://grokdebug.herokuapp.com/ 来测试我的工作。这是一个示例日志文件:
06/05/2021 15:08:48.591 - [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff] - [INFO] - some more text here (0:1): {"data":{"source":"ttyUSB0","timeTotal":"20","timeLeft":"10"},"somethingid":"main","secret":"aqdsaqlaxgaaaaaa444aa32aa1aa3aaa1aaaaaaawghhjuyeqbbjjga7a64aaa","type":"TEST","message":"SOMEMESSAGE","testid":"foo.bar1.1620313718583","timestamp":1620313728590}
我使用的 grok 表达式(和returns 没有结果)是
%{DATESTAMP:timestamp} - (?<test_data>(?<=\[)([a-zA-Z\.\[\]])*) - (?<rest>(?<=\[)(\[(\w*)\]))
当我从 (?<test_data>(?<=\[)([a-zA-Z\.\[\]])*)
和 (?<rest>(?<=\[)(\[(\w*)\]))
中删除后向表达式 (?<=\[)
时,我得到以下结果:
test_data: [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff]
rest: [INFO]
我希望得到的结果是:
test_data: aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff
rest: INFO
非常感谢对我做错了什么的帮助/解释
你正在匹配一个序列的模式,所以你需要消耗它们,否则正则表达式引擎无法到达后续(最右边的) ) 图案部分。
环视不是消费模式,它们只是检查某个位置的上下文。因此, (?<=\[)
是一个永远不会匹配的模式,因为 space 不能同时是 [
字符。这就是您的模式不起作用的原因。
您可以使用
%{DATESTAMP:timestamp} - \[%{DATA:test_data}\] - \[%{DATA:rest}\]
现在,正则表达式引擎将找到 timestamp
模式,然后它将使用 space+-
+space,然后是 [
字符,然后是 test_data
、] - [
、rest
部分和一个 ]
字符。
我正在尝试学习如何第一次使用 logstash 的 grok 过滤器捕获日志文件中的不同字段,但无法正确解析它。我正在使用 https://grokdebug.herokuapp.com/ 来测试我的工作。这是一个示例日志文件:
06/05/2021 15:08:48.591 - [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff] - [INFO] - some more text here (0:1): {"data":{"source":"ttyUSB0","timeTotal":"20","timeLeft":"10"},"somethingid":"main","secret":"aqdsaqlaxgaaaaaa444aa32aa1aa3aaa1aaaaaaawghhjuyeqbbjjga7a64aaa","type":"TEST","message":"SOMEMESSAGE","testid":"foo.bar1.1620313718583","timestamp":1620313728590}
我使用的 grok 表达式(和returns 没有结果)是
%{DATESTAMP:timestamp} - (?<test_data>(?<=\[)([a-zA-Z\.\[\]])*) - (?<rest>(?<=\[)(\[(\w*)\]))
当我从 (?<test_data>(?<=\[)([a-zA-Z\.\[\]])*)
和 (?<rest>(?<=\[)(\[(\w*)\]))
中删除后向表达式 (?<=\[)
时,我得到以下结果:
test_data: [aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff]
rest: [INFO]
我希望得到的结果是:
test_data: aa.bbbbbbbbbbbbbbb.cccccccccc.ddddddd.EEEeeeEeeeeEeeeeee.ffffFffffFff
rest: INFO
非常感谢对我做错了什么的帮助/解释
你正在匹配一个序列的模式,所以你需要消耗它们,否则正则表达式引擎无法到达后续(最右边的) ) 图案部分。
环视不是消费模式,它们只是检查某个位置的上下文。因此, (?<=\[)
是一个永远不会匹配的模式,因为 space 不能同时是 [
字符。这就是您的模式不起作用的原因。
您可以使用
%{DATESTAMP:timestamp} - \[%{DATA:test_data}\] - \[%{DATA:rest}\]
现在,正则表达式引擎将找到 timestamp
模式,然后它将使用 space+-
+space,然后是 [
字符,然后是 test_data
、] - [
、rest
部分和一个 ]
字符。