Grok 调试器和 Logstash grok 中的不同行为

Different behavior in Grok debugger and Logstash grok

我的场景如下:我有一个堆栈跟踪作为我的 Logstash 实例的输入。因为我使用 GELF,所以整个堆栈跟踪在一个字段中传输,看起来像这样(缩短):

javax.servlet.ServletException: Something bad happened
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
Caused by: java.lang.IllegalArgumentException
    at ...
Caused by: java.lang.NullPointerException
    at ...

我想要达到的是捕获堆栈跟踪中最后一个 "Caused by" 冒号后面的行的其余部分(此处:'java.lang.NullPointerException'),以便将其存储到专用的场地。 为此,我使用以下 oniguruma 正则表达式:

[\s\S]*\nCaused by:(?<cause>.*)[\s\S]*

奇怪的是,这与 grok 调试器完美配合,但是一旦我将正则表达式移动到我的 Logstash conf,它也会让我获得剩余的堆栈跟踪 ('java.lang.NullPointerException at ...'),跳过\n 字符。 这可能是 Logstash 或调试器中的错误吗?

感谢您的提示!

您可以使用 [^\r\n] 字符明确定义 不是换行符 class:

[\s\S]*\nCaused by:(?<cause>[^\r\n]*)[\s\S]*
                            ^^^^^^^^