Различное поведение в отладчике Grok и 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 ...

Чего я хочу достичь, так это захватить оставшуюся часть строки, которая следует за двоеточием последнего «Вызвано» в трассировке стека (здесь: «java.lang.NullPointerException»), чтобы сохранить ее в специальном поле. Для этого я использую следующее регулярное выражение oniguruma:

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

Странно то, что это отлично работает с отладчиком grok, но как только я перемещаю регулярное выражение в свою конфигурацию Logstash, он также получает остальную часть трассировки стека ('java.lang.NullPointerException at...'), пропуская символ \n. Может ли это быть ошибкой внутри Logstash или отладчика?

Спасибо за ваши подсказки!


person pklndnst    schedule 11.04.2016    source источник
comment
Затем попробуйте явно определить не разрыв строки с помощью [\s\S]*\nCaused by:(?<cause>[^\r\n]*)[\s\S]*   -  person Wiktor Stribiżew    schedule 11.04.2016


Ответы (1)


Вы можете явно определить не разрыв строки с классом символов [^\r\n]:

[\s\S]*\nCaused by:(?<cause>[^\r\n]*)[\s\S]*
                            ^^^^^^^^ 
person Wiktor Stribiżew    schedule 11.04.2016
comment
Хороший обходной путь, работает отлично! =) Кстати: у вас есть идеи, откуда могут появиться эти различия в поведении? - person pklndnst; 11.04.2016