Logstash 匹配多行事件中第二行的字段(异常名称)

Logstash 匹配多行事件中第二行的字段(异常名称),logstash,logstash-grok,Logstash,Logstash Grok,我有多行Log4J日志。第一行后面的行是可选的。第一行包含日志消息,之后是stacktrace。我想提取stacktrace上的顶级异常类名,它是第二行的第一部分。例如: 2016-01-18 13:19:34,812 [myScheduler-4] ERROR com.company.framework.service.notification.TriggerServiceImpl- Hibernate operation: could not load an entity: [com.com

我有多行Log4J日志。第一行后面的行是可选的。第一行包含日志消息,之后是stacktrace。我想提取stacktrace上的顶级异常类名,它是第二行的第一部分。例如:

2016-01-18 13:19:34,812 [myScheduler-4] ERROR com.company.framework.service.notification.TriggerServiceImpl- Hibernate operation: could not load an entity: [com.company.framework.pojo.jc3iedm.ReportingData#32300000000000565988];.
java.sql.SQLException: Connection has already been closed.
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:118)
    at com.sun.proxy.$Proxy47.prepareStatement(Unknown Source)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
我对“java.sql.SQLException”部分感兴趣。我写了以下grok模式:

LOG4J_DATESTAMP %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
LOG4J_LOG %{LOG4J_DATESTAMP:timestamp} \[%{GREEDYDATA:thread}\] {LOGLEVEL:level} %{JAVACLASS:class}\-%{SPACE}%{JAVALOGMESSAGE:logmessage}%{SPACE}(^%{JAVACLASS:exception})?
(^%{JAVACLASS:exception})是应该与下一行匹配的部分。它与grokconstructor.appspot.com上的预期匹配,但我无法让它与logstash 2.1.1版本一起工作。所有其他字段都已成功提取

这是logstash conf文件:

input {
 file {
    path => "D:/projects/ELK/localhost.log"
    start_position => beginning
    codec => multiline {
      patterns_dir => "../patterns"
      pattern => "^%{LOG4J_DATESTAMP}"
      negate => true
      what => "previous"
    }
 }
}

filter {
 grok {
    match => { "message" => "%{LOG4J_LOG}"}
 }
}

output { 
  elasticsearch { }
}
我的猜测是logmessage(
JAVALOGMESSAGE(.*)
)一直匹配所有内容,因此没有任何内容可以匹配。但我的问题是它在grokconstructor.appspot.com上是如何工作的?如何通过logstash实现这一点

谢谢。
伊尔哈米(ilhami)

我成功率更高,在使用中看到的差异更少

我想到了:

LOG4J_LOG %{LOG4J_DATESTAMP:timestamp} \[(?<thread>[^\]]+)?\] %{LOGLEVEL:level} %{JAVACLASS:class} - (?<message>[^\r\n]+)((\r?\n)(?<extra>(.|\r?\n)+))?
LOG4J_LOG%{LOG4J_邮戳:时间戳}\[(?[^\]]+)?\]%{LOGLEVEL:level}%{JAVACLASS:class}-(?[^\r\n]+)(\r?\n)((?(.\r?\n)+)?

我也看到了logstash/grok构造函数的不同之处。你找到解决办法了吗?