【发布时间】:2019-04-19 18:58:51
【问题描述】:
我正在努力在 splunk 中显示来自 docker json-file 的日志。在大多数情况下,我让它工作,除了打印堆栈跟踪时。我知道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]) 匹配到最后一行,但如果在其下有行,则不再匹配。
【问题讨论】:
-
使用实际的程序逻辑而不是正则表达式会更好。无论如何,我不会花时间为提出 23 个问题但未接受任何答案的人发布答案。
-
这是为了与 Splunk 集成我们的日志输出。当然,有了程序逻辑就简单多了。
标签: java regex docker logging splunk