0

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

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)

但是,下面的行是在开始时跟踪的每一行中:

信息 | 虚拟机 1 | 主要 | 2014/11/06 13:41:30.112 |

有谁知道如何将这一行留在“错误”附近的开头,并用 grok 将这部分行放在跟踪中,并在 Logstash 中作为一条消息获得完整的跟踪?欢迎任何其他解决方案。

4

1 回答 1

0

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

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

其中,如果它是“贪婪的”,可能会给你留下这样的一行:

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

然后可以将其与后续的 multiline{} 过滤器结合使用。

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

于 2015-11-08T16:49:54.523 回答