在 grok 中重用捕获
Reuse of a capture in grok
我正在尝试重用来自 Logstash 的 grok 插件中的捕获。
我有这个日志文件
30 Jul 2019 09:56:28 <ID1> DEVICE0 START_THREAD THREAD_ID(B01234)
30 Jul 2019 09:56:28 <ID1> DEVICE1 START_THREAD THREAD_ID(B12345)
30 Jul 2019 09:56:28 <ID1> DEVICE2 START_THREAD THREAD_ID(A12345)
30 Jul 2019 09:56:28 <ID2> DEVICE1 PROCESSING SPOOLID 100
30 Jul 2019 09:56:28 <ID2> DEVICE2 PROCESSING SPOOLID 101
30 Jul 2019 09:56:28 <ID2> DEVICE2 PROCESSING SPOOLID 101
30 Jul 2019 09:56:28 <ID2> DEVICE1 PROCESSING SPOOLID 100
30 Jul 2019 09:56:28 <ID4> DEVICE1 SPOOLID 100 PROCESSED
30 Jul 2019 09:56:28 <ID4> DEVICE2 SPOOLID 101 PROCESSED
30 Jul 2019 09:56:28 <ID3> DEVICE2 STOP_THREAD THREAD_ID(B12345)
30 Jul 2019 09:56:28 <ID3> DEVICE2 STOP_THREAD THREAD_ID(A12345)
30 Jul 2019 09:56:28 <ID1> DEVICE2 START_THREAD THREAD_ID(A23456)
30 Jul 2019 09:56:29 <ID2> DEVICE2 PROCESSING SPOOLID 102
30 Jul 2019 09:56:29 <ID2> DEVICE2 PROCESSING SPOOLID 102
30 Jul 2019 09:56:29 <ID4> DEVICE2 SPOOLID 102 PROCESSED
30 Jul 2019 09:56:29 <ID3> DEVICE2 STOP_THREAD THREAD_ID(A23456)
30 Jul 2019 09:56:29 <ID2> DEVICE0 PROCESSING SPOOLID 99
30 Jul 2019 09:56:29 <ID4> DEVICE0 SPOOLID 99 PROCESSED
30 Jul 2019 09:56:29 <ID3> DEVICE0 STOP_THREAD THREAD_ID(B12345)
我想做的是将设备和 SPOOL_ID 捕获到一个 logstash 事件中。
到目前为止,我已经设法构建了这个正则表达式,它为我提供了相应设备的正确 SPOOLID
/.*?\>\s+(\b.*?\b)\s*START_THREAD.*?\s+SPOOLID\s+(\d+)\s+PROCESSED/ms
我一直在尝试使用这段代码将这个 RegEx 翻译成 grok
(?m)%{DATA}\>\s+\b%{DATA:device}\b\s*START_THREAD%{DATA}(?<device>\s+SPOOLID\s+%{NUMBER:num}\s+PROCESSED)
不幸的是,我得到的相应设备的 SPOOLID 错误(对于 DEVICE0,我得到的 SPOOLID 是 100 而不是 99)。
我无法弄清楚我的 grok 代码有什么问题。
也许这里有人可以找到我的代码中的错误并修复它?
重点是 %{...}
组实际上与命名捕获组的工作方式不同,您需要创建一个辅助命名捕获组并使用命名反向引用引用它 \k<name>
语法:
(?m)%{DATA}>\s+(?<aux>\b%{DATA:device}\b)\s*START_THREAD%{DATA}\k<aux>(?<device>\s+SPOOLID\s+%{NUMBER:num}\s+PROCESSED)
注意此处的 (?<aux>\b%{DATA:device}\b)
命名组和 \k<aux>
反向引用。
在此处查看 Oniguruma regex syntax 的更多信息。
我正在尝试重用来自 Logstash 的 grok 插件中的捕获。 我有这个日志文件
30 Jul 2019 09:56:28 <ID1> DEVICE0 START_THREAD THREAD_ID(B01234)
30 Jul 2019 09:56:28 <ID1> DEVICE1 START_THREAD THREAD_ID(B12345)
30 Jul 2019 09:56:28 <ID1> DEVICE2 START_THREAD THREAD_ID(A12345)
30 Jul 2019 09:56:28 <ID2> DEVICE1 PROCESSING SPOOLID 100
30 Jul 2019 09:56:28 <ID2> DEVICE2 PROCESSING SPOOLID 101
30 Jul 2019 09:56:28 <ID2> DEVICE2 PROCESSING SPOOLID 101
30 Jul 2019 09:56:28 <ID2> DEVICE1 PROCESSING SPOOLID 100
30 Jul 2019 09:56:28 <ID4> DEVICE1 SPOOLID 100 PROCESSED
30 Jul 2019 09:56:28 <ID4> DEVICE2 SPOOLID 101 PROCESSED
30 Jul 2019 09:56:28 <ID3> DEVICE2 STOP_THREAD THREAD_ID(B12345)
30 Jul 2019 09:56:28 <ID3> DEVICE2 STOP_THREAD THREAD_ID(A12345)
30 Jul 2019 09:56:28 <ID1> DEVICE2 START_THREAD THREAD_ID(A23456)
30 Jul 2019 09:56:29 <ID2> DEVICE2 PROCESSING SPOOLID 102
30 Jul 2019 09:56:29 <ID2> DEVICE2 PROCESSING SPOOLID 102
30 Jul 2019 09:56:29 <ID4> DEVICE2 SPOOLID 102 PROCESSED
30 Jul 2019 09:56:29 <ID3> DEVICE2 STOP_THREAD THREAD_ID(A23456)
30 Jul 2019 09:56:29 <ID2> DEVICE0 PROCESSING SPOOLID 99
30 Jul 2019 09:56:29 <ID4> DEVICE0 SPOOLID 99 PROCESSED
30 Jul 2019 09:56:29 <ID3> DEVICE0 STOP_THREAD THREAD_ID(B12345)
我想做的是将设备和 SPOOL_ID 捕获到一个 logstash 事件中。 到目前为止,我已经设法构建了这个正则表达式,它为我提供了相应设备的正确 SPOOLID
/.*?\>\s+(\b.*?\b)\s*START_THREAD.*?\s+SPOOLID\s+(\d+)\s+PROCESSED/ms
我一直在尝试使用这段代码将这个 RegEx 翻译成 grok
(?m)%{DATA}\>\s+\b%{DATA:device}\b\s*START_THREAD%{DATA}(?<device>\s+SPOOLID\s+%{NUMBER:num}\s+PROCESSED)
不幸的是,我得到的相应设备的 SPOOLID 错误(对于 DEVICE0,我得到的 SPOOLID 是 100 而不是 99)。 我无法弄清楚我的 grok 代码有什么问题。 也许这里有人可以找到我的代码中的错误并修复它?
重点是 %{...}
组实际上与命名捕获组的工作方式不同,您需要创建一个辅助命名捕获组并使用命名反向引用引用它 \k<name>
语法:
(?m)%{DATA}>\s+(?<aux>\b%{DATA:device}\b)\s*START_THREAD%{DATA}\k<aux>(?<device>\s+SPOOLID\s+%{NUMBER:num}\s+PROCESSED)
注意此处的 (?<aux>\b%{DATA:device}\b)
命名组和 \k<aux>
反向引用。
在此处查看 Oniguruma regex syntax 的更多信息。