我正在尝试编写一个正则表达式来捕获Spring Batch作业的作业运行时间,但我被卡住了。下面是一些示例,说明春季批处理作业运行时的日志可能是什么样子的。我也放下了我目前拥有的东西,但是当作业可能运行超过一分钟时,我拥有的正则表达式感到困惑。这里的任何帮助将不胜感激。我试图得到的最终结果是 splunk 中的一个面板,它显示了平均每日运行时间。
同样在任何人询问之前,过去几天我一直在使用 regex101,但仍然没有得到好的结果。图堆栈社区可能会有所帮助!
可能的作业时间格式:
709ms
59s709ms
1m59s709ms
我当前的查询仅适用于上面的前两个示例。还有没有办法获得一个表达式,我不需要在捕获组的末尾放置一个数字?
当前正则表达式查询:
(?<jobRunTimeMs1>d*)ms?|(?<jobRunTimeS2>d*)s?(?<jobRunTimeMs2>d*)ms?|(?<jobRunTimeM3>d*)m?(?<jobRunTimeS3>d*)s?(?<jobRunTimeMs3>d*)ms?
如果从正则表达式中提取额外的问号,它将按预期运行:
| rex field=_raw "(?<jobRunTimeMs1>d+)ms|(?<jobRunTimeS2>d+)s(?<jobRunTimeMs2>d+)ms|(?<jobRunTimeM3>d+)m(?<jobRunTimeS3>d+)s(?<jobRunTimeMs3>d+)ms"
附加几个coalesce
将它们组合在一起,并删除带有fields
的无关字段:
| eval ms=coalesce(ms1,ms2,ms3), s=coalesce(s2,s3), m=m3
| fields - ms1 ms2 ms3 s2 s3 m3
但是,为了可读性,我通常更喜欢运行顺序的单个提取(尤其是当格式可能有所不同时,就像您的一样)(并且不需要在之后执行coalesce
步骤):
| rex field=_raw "(?<minutes>d+)md"
| rex field=_raw "m?(?<seconds>d+)s"
| rex field=_raw "s?(?<milliseconds>d+)ms"
我认为你需要
(?:(?<jobRunTimeM3>d+)m)?(?:(?<jobRunTimeS2>d+)s)?(?<jobRunTimeMs2>d+)ms?
请参阅正则表达式演示。在这里,正则表达式匹配
(?:(?<jobRunTimeM3>d+)m)?
- 捕获到组中的一个或多个可选数字jobRunTimeM3
然后是m
字符(?:(?<jobRunTimeS2>d+)s)?
- 捕获到组中的一个或多个数字jobRunTimeS2
然后是s
字符(?<jobRunTimeMs2>d+)
- 将一个或多个数字捕获到组中jobRunTimeMs2
然后匹配ms?
-m
或ms
.