我有多行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实现这一目标?
感谢。 伊尔哈米
答案 0 :(得分:0)
我获得了更多成功,并且使用http://grokdebug.herokuapp.com/
看到了更少的差异我想出了:
LOG4J_LOG %{LOG4J_DATESTAMP:timestamp} \[(?<thread>[^\]]+)?\] %{LOGLEVEL:level} %{JAVACLASS:class} - (?<message>[^\r\n]+)((\r?\n)(?<extra>(.|\r?\n)+))?