用logstashparsinglog4j日志文件

我用logstashparsing多行log4j日志,我得到了最奇怪的问题。

以下是一些相关日志条目的示例:

 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  bla
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaaa
 2016-01-05 13:55:27,030 DEBUG [class] [thread]  -  blaaaaaaa

这是我log4j的logstashconfiguration:

如果[type] ==“log4j”{
    多行{
         pattern =>“(^%d {yyyy-MM-dd HH:mm:ss,SSS})”
        什么=>以前
        否定=>真实
     }
     grok {
         match => [“message”,“%{TIMESTAMP_ISO8601:logdate}%{LOGLEVEL:loglevel}(?。*)”]
     }
    date{
         match => [“logdate”,“yyyy-MM-dd HH:mm:ss,SSS”,“ISO8601”]
        时区=>“欧洲/巴黎”
     }
 }

结果很好; 没有grokparsing错误,date是好的,日志级别是好的,但是,消息内容是重复的:

 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  bla
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaaa
 2016-01-05 13:55:27,030 DEBUG [class] [thread]  -  blaaaaaaa
 [class] [thread]  -  bla
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaa
 2016-01-05 13:55:26,275 DEBUG [class] [thread]  -  blaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaa
 2016-01-05 13:55:26,282 DEBUG [class] [thread]  -  blaaaaaa
 2016-01-05 13:55:27,030 DEBUG [class] [thread]  -  blaaaaaaa

并且时间戳和日志级别从重复内容的第一行中丢失!

任何人都知道这是为什么发生?

任何帮助是受欢迎的。

473183469的发言后再编辑

多行筛选器中的date模式不能按预期工作。

我已经修改logstash的configuration来结合仅来自exception的行(就像un 文档一样 )

如果[type] ==“log4j”{
    多行{
         pattern =>“^ \ s”
        什么=>“前一个”
     }
    多行{
         pattern =>“^引起”
        什么=>“前一个”
     }
     grok {
         match => [“message”,“%{TIMESTAMP_ISO8601:logdate}%{LOGLEVEL:loglevel}(?。*)”]
     }
    date{
         match => [“logdate”,“yyyy-MM-dd HH:mm:ss,SSS”,“ISO8601”]
        时区=>“欧洲/巴黎”
     }
 }

我已经添加了另一个多行filter,以防在堆栈跟踪中出现“由…引起”行。

这工作正常,除了消息的内容以相同的方式重复! 再次缺less时间戳和日志级别:

 016-01-06 09:46:00,842错误[coyntry.org.web.LoaderListener] [线程-6]  -  java.lang.RuntimeException:java.io.FileNotFoundException:file(No such file or directory)
    在coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
    在coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
    在coyntry.org.web.LoaderListener $ LoaderThread.run(LoaderListener.java:74)
    在java.lang.Thread.run(Thread.java:745)
引起:java.io.FileNotFoundException:文件(没有这样的文件或目录)
    在java.io.FileInputStream.open(Native Method)
    在java.io.FileInputStream。(FileInputStream.java:146)
    在coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
 [coyntry.org.web.LoaderListener] [Thread-6]  -  java.lang.RuntimeException:java.io.FileNotFoundException:file(No such file or directory)
     ... 3更多,
    在coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
    在coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
    在coyntry.org.web.LoaderListener $ LoaderThread.run(LoaderListener.java:74)
    在java.lang.Thread.run(Thread.java:745)
引起:java.io.FileNotFoundException:文件(没有这样的文件或目录)
    在java.io.FileInputStream.open(Native Method)
    在java.io.FileInputStream。(FileInputStream.java:146)
    在coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
     ... 3更多

我真的不明白是怎么回事。

你真的需要multiline吗?

是不是multiline用来再次连接一个由rsyslog分割的日志?

典型的例子是java堆栈错误跟踪消息。

如果rsyslog在“\ n”分割堆栈跟踪错误,我们将不再了解任何东西,所以我们需要重新安排消息。

您的示例是不同的,因为每个日志行看起来独立于其他日志行。

总之:重复以及标题抑制来自multiline 。 要么根据您的使用情况修复multiline ,要么(正如我怀疑的那样)将其移除。