Многострочность в Logstash с меткой времени в каждой строке

У меня есть многострочный журнал, записанный в файл следующим образом:

INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 | ERROR [appHTTP50] [appEmployeeAuthenticationProvider] Can't login with username 'username'
INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 | org.framework.security.authentication.BadCredentialsException: Bad credentials
INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 |     at de.app.platform.security.CoreAuthenticationProvider.authenticate(CoreAuthenticationProvider.java:133)
INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 |     at ca.canadiantire.security.appEmployeeAuthenticationProvider.authenticate(appEmployeeAuthenticationProvider.java:39)
INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 |     at org.framework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
INFO   | jvm 1    | main    | 2014/11/06 13:41:30.112 |     at org.framework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177)

Однако строка ниже находится в каждой строке следа в начале:

ИНФОРМАЦИЯ | jvm 1 | главная | 2014/11/06 13: 41: 30.112 |

Кто-нибудь знает, как оставить эту строку в начале рядом с «ERROR» и удалить эту часть строки в трассировке с помощью grok и получить полную трассировку в виде одного сообщения в Logstash? Любые другие решения приветствуются.


person Mikhail Bibik    schedule 06.11.2015    source источник


Ответы (1)


Думаю, ответ - это gsub {}. Либо используйте условную строфу, которая удаляет предисловие из последующих строк, например:

if [message] !~ /\| ERROR / {
    mutate {
        gsub => [ "message", "^.* \| ", "" ]
    }
}

который, если он "жадный", может оставить вам такую ​​строку:

org.framework.security.authentication.BadCredentialsException: Bad credentials

который затем может быть объединен с последующим многострочным фильтром {}.

Очевидно, вам нужно сделать оба регулярных выражения достаточно общими для обработки каждого ожидаемого уровня журнала.

person Alain Collins    schedule 08.11.2015
comment
Привет, Ален, вопрос здесь в том, чтобы оставить только первую строку и удалить для других в трассировке, так как нам нужна начальная временная метка. У вас есть идеи, как это получить? Другое дело, что это нужно не только для ERROR, но и для WARN и DEBUG. Итак, я думаю, мы можем заменить просто плагином фильтра mutate (без оператора if)? - person Mikhail Bibik; 09.11.2015
comment
Я понял вопрос, поэтому и дал вам ответ. Я также понял, что будет более одного уровня, поэтому упомянул об этом в своем ответе. Нет, вы не можете удалить «если». - person Alain Collins; 09.11.2015