Logstash中的多行,每行包含时间戳

时间:2015-11-06 13:50:03

标签: logstash logstash-grok logstash-configuration logstash-forwarder

我有一个多行日志写在文件中,如下所示:

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)

但是,下面的行是在开始的每条线上:

  

INFO | jvm 1 |主要| 2014/11/06 13:41:30.112 |

有没有人知道如何将这一行留在“ERROR”附近的开始处,并使用grok将这部分行放在跟踪中,并在Logstash中获得完整的跟踪作为单个消息?欢迎任何其他解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

然后可以与后续的多行{}过滤器结合使用。

显然,您需要使两个正则表达足够通用,以处理您期望的每个日志级别。