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



我有多行 Log4J 日志。第一个行之后的行是可选的。第一行包含日志消息,然后是堆栈跟踪。我想提取堆栈跟踪上的顶级异常类名称,它是第二行的第一部分。举个例子:

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 版本一起使用。所有其他字段均已成功提取。

这是日志存储 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 { }
}

我的猜测是日志消息(JAVALOGMESSAGE (.*))将所有内容匹配到最后,因此没有什么可以匹配的。但我的问题是它在 grokconstructor.appspot.com 上是如何工作的?以及如何使用 logstash 实现这一目标?

谢谢。伊尔哈米

我取得了更多的成功,并且看到的差异更少,使用 http://grokdebug.herokuapp.com/

我想出了:

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

最新更新