Log4j2提供exception
和exceptionRootCause
事件模板解析器.然而,这些只访问顶层和底层的异常.
所以当我有了这个
Throwable a = new RuntimeException("a");
Throwable b = new RuntimeException("b", a);
Throwable c = new RuntimeException("c", b);
log.error("Exception", c);
我只能看到a
和c
,但我看不到中间的任何东西.Java对c.printStackTrace();
本身就支持这一点.
java.lang.RuntimeException: c
Caused by: java.lang.RuntimeException: b
Caused by: java.lang.RuntimeException: a
如何在log4j中获取此信息?
我的配置:
{
"exception": {
"class_name": {
"$resolver": "exception",
"field": "className"
},
"message": {
"$resolver": "exception",
"field": "message"
},
"cause": {
"class_name": {
"$resolver": "exceptionRootCause",
"field": "className"
},
"message": {
"$resolver": "exceptionRootCause",
"field": "message"
},
"stack_trace": {
"$resolver": "exceptionRootCause",
"field": "stackTrace",
"stackTrace": {
"elementTemplate": {
"class_name": {
"$resolver": "stackTraceElement",
"field": "className"
},
"method": {
"$resolver": "stackTraceElement",
"field": "methodName"
},
"file": {
"$resolver": "stackTraceElement",
"field": "fileName"
},
"line": {
"$resolver": "stackTraceElement",
"field": "lineNumber"
}
}
}
}
}
},
"line": {
"$resolver": "source",
"field": "lineNumber"
},
"class_name": {
"$resolver": "source",
"field": "className"
},
"@version": 1,
"source_host": "${hostName}",
"message": {
"$resolver": "message"
},
"thread_name": {
"$resolver": "thread",
"field": "name"
},
"@timestamp": {
"$resolver": "timestamp"
},
"level": {
"$resolver": "level",
"field": "name"
},
"file": {
"$resolver": "source",
"field": "fileName"
},
"method": {
"$resolver": "source",
"field": "methodName"
},
"logger_name": {
"$resolver": "logger",
"field": "name"
}
}