我有一个多行日志写在文件中,如下所示:
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中获得完整的跟踪作为单个消息?欢迎任何其他解决方案。
答案 0 :(得分:0)
我认为gsub {}就是答案。要么有条件节,要从后续行中删除前言,例如:
if [message] !~ /\| ERROR / {
mutate {
gsub => [ "message", "^.* \| ", "" ]
}
}
如果它是贪婪的"可能会给你留下这样的一句话:
org.framework.security.authentication.BadCredentialsException: Bad credentials
然后可以与后续的多行{}过滤器结合使用。
显然,您需要使两个正则表达足够通用,以处理您期望的每个日志级别。