Splunk 正则表达式换行符,将多个 ERROR [stderr] 行合并为一个事件
Splunk regex line breaker, combining multiple ERROR [stderr] lines into one event
我正在努力在 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
正则表达式的事件,这适用于 INFO
消息和来自我们记录器的单行 ERROR
消息,但不适用于上面的堆栈跟踪。
我想将 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])
匹配到最后一行,但如果该行下面有行,其中 none 行将不再匹配。
在模式的这一部分 {"log":"[0-9]+.*[0-9]\s+
中,您使用 [0-9]+.*[0-9]\s+
匹配时间戳部分可能会导致不必要的 bracktracking,因为 .*
将首先匹配到字符串的末尾.
你可以让时间戳像模式更具体,而不是像 [0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+
要获得匹配项,一种选择是匹配包含 stderr
的行。然后重复将以下行与该模式匹配 0+ 次,从换行符开始将它们组合起来。
要继续匹配其他行,您可以在 ERROR
和 alternation.
之后使用否定前瞻
^(?:{"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+ ERROR \[stderr\].*
(?:
非捕获组
\n{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR \[stderr\].*
)*
关闭非捕获组并重复0+次
|
或
{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR (?!\[stderr\]).*
)
关闭非捕获组
我正在努力在 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
正则表达式的事件,这适用于 INFO
消息和来自我们记录器的单行 ERROR
消息,但不适用于上面的堆栈跟踪。
我想将 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])
匹配到最后一行,但如果该行下面有行,其中 none 行将不再匹配。
在模式的这一部分 {"log":"[0-9]+.*[0-9]\s+
中,您使用 [0-9]+.*[0-9]\s+
匹配时间戳部分可能会导致不必要的 bracktracking,因为 .*
将首先匹配到字符串的末尾.
你可以让时间戳像模式更具体,而不是像 [0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+
要获得匹配项,一种选择是匹配包含 stderr
的行。然后重复将以下行与该模式匹配 0+ 次,从换行符开始将它们组合起来。
要继续匹配其他行,您可以在 ERROR
和 alternation.
^(?:{"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+ ERROR \[stderr\].*
(?:
非捕获组\n{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR \[stderr\].*
)*
关闭非捕获组并重复0+次|
或{"log":"[0-9]{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+ ERROR (?!\[stderr\]).*
)
关闭非捕获组