Logstash 如何获取最后一次出现的正则表达式匹配项?

Logstash how to get the last occurance of a regex match?

所以这是一个奇怪的请求。我有一个 logstash 文件,它读取 jenkins 构建并从控制台输出中提取 commit_id。这是我正在谈论的输出类型的示例:

17:11:07  Checking out Revision 071b1f53bab3c3453z46afe40c4e3068zc513eb4 (logstash_upgrade)
17:11:07   > git config core.sparsecheckout # timeout=10
17:11:07   > git checkout -f 071b1f53bab3c3453z46afe40c4e3068zc513eb4
17:11:07  Commit message: "Aqua scan"


17:11:07  Checking out Revision 071b1f5abab3c3a53e46afe40c4e30685ca13eb4 (logstash_upgrade)
17:11:07   > git config core.sparsecheckout # timeout=10
17:11:07   > git checkout -f 071b1f53bab3c3453e46afe40a4e30685c5a3eb4
17:11:07  Commit message: "real commit"

这是我试图提取上面的提交 ID 的 grok 匹配项:

grok {
    match => { "message_string" => "(?<GIT_COMMIT>(?<=Checking out Revision )\w*)"}
}

问题来了。字符串“Checking out Revision”多次出现。因此,我们的 logstash 将选择它的第一次出现并将 GIT_COMMIT 与该 id 匹配。问题是有时第一个 commit_id 不是正确的,这只是我们 运行.

安全扫描的 commit_id

如果我能找到“Checking out Revision”的 LAST 实例并将 commit_id 与 GIT_COMMIT 相匹配,那将是理想的选择。

但是,我不确定这是否可以通过 logstash 实现,因为我找不到任何关于它的文档。不幸的是,没有办法改变模式,因为它通常从字符串的第一次出现到最后一次出现都是相同的格式。

如果有人知道始终将此 grok-match 与找到的字符串的最后一个实例相匹配的方法,我将不胜感激。

您可以使用

grok { match => { "message" => "%{GREEDYDATA}(?<GIT_COMMIT>(?<=Checking out Revision )\w*)"} }

GREEDYDATA 不断消耗字符,直到正则表达式的其余部分停止匹配为止。所以它会消耗所有内容,直到你的前瞻匹配的最后一个地方。