Logstash如何匹配正则最后一次出现结果以提取Jenkins日志中正确的GIT_COMMIT
解决Logstash提取Jenkins日志最后一次commit_id的方案
方案1:修改Grok正则(最优,无需额外插件)
利用正则的贪婪匹配特性,先匹配所有前面的内容,只保留最后一次Checking out Revision 对应的commit_id,配置如下:
grok { match => { "message_string" => ".*Checking out Revision (?<GIT_COMMIT>\w*)" } }
规则说明:正则开头的.*会贪婪匹配尽可能长的字符串,直到找到最后一次出现的Checking out Revision 字符段,后续提取的\w*自然就是最后一次的commit_id,性能最高、配置最简单,适配现有场景。
方案2:全量捕获后取最后一位(适合需要保留所有commit_id的场景)
如果需要留存所有出现过的commit_id,可以先开启全匹配把所有结果存入数组,再取数组最后一位作为最终值:
- 首先修改grok配置开启全匹配:
grok { match => { "message_string" => "(?<GIT_COMMIT_ALL>(?<=Checking out Revision )\w*)" } match_all => true # 所有符合规则的结果会以数组形式存入GIT_COMMIT_ALL字段 }
- 新增ruby过滤器提取数组最后一位:
ruby { code => "event.set('GIT_COMMIT', event.get('GIT_COMMIT_ALL')[-1])" # 不需要保留全量commit的话可以加上下面的配置删除中间字段 # remove_field => ["GIT_COMMIT_ALL"] }
内容的提问来源于stack exchange,提问作者python_help
相关产品推荐
相关产品推荐

