春季批处理作业时间的 Splunk 正则表达式匹配



我正在尝试编写一个正则表达式来捕获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?-mms.

最新更新