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|main |2014/11/06 13:41:30.12|

有人知道如何在"ERROR"附近的开头留下这一行,并将这一行的这一部分放在带有grok的跟踪中,然后在Logstash中作为一条消息获得完整的跟踪吗?欢迎任何其他解决方案。

我认为gsub{}就是答案。要么有一个条件节,从后面的行中删除序言,例如:

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

如果它是"贪婪的",可能会给你留下这样一句话:

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

然后可以将其与随后的多行{}滤波器组合。

显然,您需要使这两个regexp都具有足够的通用性,以处理您期望的每个日志级别。

最新更新