gpt4 book ai didi

java - Splunk 正则表达式换行器,将多个 ERROR [stderr] 行组合成一个事件

转载 作者:行者123 更新时间:2023-11-30 05:40:25 26 4
gpt4 key购买 nike

我正在努力在 splunk 中显示来自 docker json 文件的日志。在大多数情况下,我都可以使用它,除了打印堆栈跟踪时。我知道 e.printStackTrace() 不是最佳实践,但我们的服务有一些我想在 Splunk 中支持的服务。

我正在配置 props.conf 文件,并且 props.conf 中有以下 LINE_BREAKER 正则表达式。LINE_BREAKER=([\n\r]+)\s*{"log":"[0-9]+.*[0-9]\s+

这将匹配到以下形式的时间戳的末尾:{"log":"2019-04-18 15:18:18,796 ERROR [stderr] ...

问题是打印的堆栈跟踪是多行出现的,如下所示:

{"log":"2019-04-18 15:18:18,796 ERROR [stderr] (default-threads - 3) java.util.NoSuchElementException: No value present\n","stream":"stdout","time":"2019-04-18T19:18:18.800485539Z"}
{"log":"2019-04-18 15:18:18,804 ERROR [stderr] (default-threads - 3) at java.util.Optional.get(Optional.java:135)\n","stream":"stdout","time":"2019-04-18T19:18:18.806510971Z"}
{"log":"2019-04-18 15:18:19,259 ERROR [stderr] (default-threads - 3) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n","stream":"stdout","time":"2019-04-18T19:18:19.264689098Z"}
{"log":"2019-04-18 15:18:19,259 ERROR [stderr] (default-threads - 3) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n","stream":"stdout","time":"2019-04-18T19:18:19.281810119Z"}
{"log":"2019-04-18 15:18:19,274 ERROR [stderr] (default-threads - 3) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n","stream":"stdout","time":"2019-04-18T19:18:19.28185714Z"}
{"log":"2019-04-18 15:18:19,275 ERROR [stderr] (default-threads - 3) at java.lang.reflect.Method.invoke(Method.java:498)\n","stream":"stdout","time":"2019-04-18T19:18:19.281867696Z"}
{"log":"2019-04-18 15:18:19,275 ERROR [stderr] (default-threads - 3) at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)\n","stream":"stdout","time":"2019-04-18T19:18:19.281875844Z"}
{"log":"2019-04-18 15:18:19,498 ERROR [org.apache.activemq.ActiveMQSession] (default-threads - 3) error dispatching message: : javax.ejb.EJBTransactionRolledbackException\n","stream":"stdout","time":"2019-04-18T19:18:19.523359025Z"}

...等等。直到堆栈跟踪结束。每行最终都是一个基于我的 LINE_BREAKER 正则表达式的事件,这对于来 self 们记录器的 INFO 消息和单行 ERROR 消息来说很好,但不适用于上面的堆栈跟踪。

我想将错误 [​​stderr] 的堆栈跟踪合并到一个事件中。所以我的换行符应该匹配到下一个不是 [stderr] 的时间戳消息。

在我的示例中,它应该从第一行与 ERROR [stderr] 匹配,直到:{"log":"2019-04-18 15:18:19,498(上面最后一行日志)。

我尝试添加负向前瞻,但现在它只会匹配 1 次。 ([\n\r]+)\s*{"log":"[0-9]+.*[0-9]\s+[\s\S]+\[(?!stderr] ) 匹配到最后一行,但如果该行下面还有行,则不再匹配。

最佳答案

在模式 {"log":"[0-9]+.*[0-9]\s+ 的这一部分中,您使用 [0- 匹配时间戳部分9]+.*[0-9]\s+ 可能会导致不必要的括号跟踪,因为 .* 将首先匹配直到字符串末尾。

您可以使时间戳之类的模式更具体,例如 [0-9]{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2},\d+

要获取匹配项,一种选择是匹配包含 stderr 的行。然后重复将以下几行与该模式匹配 0 次以上,以换行符开头将它们组合起来。

要保持匹配其他行,您可以在 ERRORalternation 之后使用负向前看。 .

^(?:{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR \[stderr\].*(?:\n{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR \[stderr\].*)*|{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR (?!\[stderr\]).*)
  • ^ 字符串开头
  • (?: 非捕获组
    • {"log":"[0-9]{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2},\d+ 错误\[stderr\].*
    • (?: 非捕获组
      • \n{"log":"[0-9]{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2 },\d+ 错误\[stderr\].*
    • )* 关闭非捕获组并重复 0 次以上
    • | 或者
    • {"log":"[0-9]{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2},\d+ 错误 (?!\[stderr\]).*
  • ) 关闭非捕获组

Regex demo

关于java - Splunk 正则表达式换行器,将多个 ERROR [stderr] 行组合成一个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55766556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com