匹配多行事件

时间:2016-01-25 13:48:21

标签: logstash logstash-grok

我有多行Log4J日志。第一个之后的行是可选的。第一行包含日志消息,之后是堆栈跟踪。我想在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实现这一目标?

感谢。 伊尔哈米

1 个答案:

答案 0 :(得分:0)

我获得了更多成功,并且使用http://grokdebug.herokuapp.com/

看到了更少的差异

我想出了:

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