本文已参与「新人创作礼」活动,一起开启掘金创作之路。
日志打印:
为什么像下边代码中的 第一个log也能正常的打出堆栈信息,因为,在发现没有throwable 的时候,会默认的取参数中的最后一个参数。
public static void main(String[] args) {
try{
caculate();
}catch (Exception e){
log.error("失败了。orderNo:{},{},{}","098765431-","987-" ,e);
log.error("---------------------------------------------------");
log.error("失败了2号。orderNo:098765431," ,e);
log.error("---------------------------------------------------");
log.error("失败了3号。orderNo:098765431,{},{}" ,"987-",e);
}
}
private static void caculate(){
int i = 10/0;
}
结果
08:39:59.157 [main] ERROR com.example.mystest.controller.TestController - 失败了。orderNo:098765431-,987-,{}
java.lang.ArithmeticException: / by zero
at com.example.mystest.controller.TestController.caculate(TestController.java:114)
at com.example.mystest.controller.TestController.main(TestController.java:101)
08:39:59.255 [main] ERROR com.example.mystest.controller.TestController - ---------------------------------------------------
08:39:59.255 [main] ERROR com.example.mystest.controller.TestController - 失败了2号。orderNo:098765431,
java.lang.ArithmeticException: / by zero
at com.example.mystest.controller.TestController.caculate(TestController.java:114)
at com.example.mystest.controller.TestController.main(TestController.java:101)
08:39:59.255 [main] ERROR com.example.mystest.controller.TestController - ---------------------------------------------------
08:39:59.255 [main] ERROR com.example.mystest.controller.TestController - 失败了3号。orderNo:098765431,987-,{}
java.lang.ArithmeticException: / by zero
at com.example.mystest.controller.TestController.caculate(TestController.java:114)
at com.example.mystest.controller.TestController.main(TestController.java:101)
debug 进入
public void error(String format, Object... arguments);
继续debug
public void error(String format, Object... argArray) {
filterAndLog_0_Or3Plus(FQCN, null, Level.ERROR, format, argArray, null);
}
go on
private void filterAndLog_0_Or3Plus(String localFQCN, Marker marker, Level level, String msg, Object[] params, Throwable t) {
FilterReply decision = this.loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg, params, t);
if (decision == FilterReply.NEUTRAL) {
if (this.effectiveLevelInt > level.levelInt) {
return;
}
} else if (decision == FilterReply.DENY) {
return;
}
**this.buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t);**
}
private void buildLoggingEventAndAppend(String localFQCN, Marker marker, Level level, String msg, Object[] params, Throwable t) {
** LoggingEvent le = new LoggingEvent(localFQCN, this, level, msg, t, params);**
le.setMarker(marker);
this.callAppenders(le);
}
public LoggingEvent(String fqcn, Logger logger, Level level, String message, Throwable throwable, Object[] argArray) {
this.fqnOfLoggerClass = fqcn;
this.loggerName = logger.getName();
this.loggerContext = logger.getLoggerContext();
this.loggerContextVO = this.loggerContext.getLoggerContextRemoteView();
this.level = level;
this.message = message;
this.argumentArray = argArray;
if (throwable == null) {
**throwable = this.extractThrowableAnRearrangeArguments(argArray);**
}
if (throwable != null) {
this.throwableProxy = new ThrowableProxy(throwable);
LoggerContext lc = logger.getLoggerContext();
if (lc.isPackagingDataEnabled()) {
this.throwableProxy.calculatePackagingData();
}
}
this.timeStamp = System.currentTimeMillis();
}
private Throwable extractThrowableAnRearrangeArguments(Object[] argArray) {
**Throwable extractedThrowable = EventArgUtil.extractThrowable(argArray);**
if (EventArgUtil.successfulExtraction(extractedThrowable)) {
this.argumentArray = EventArgUtil.trimmedCopy(argArray);
}
return extractedThrowable;
}
public static final Throwable extractThrowable(Object[] argArray) {
if (argArray != null && argArray.length != 0) {
Object lastEntry = argArray[argArray.length - 1];
return lastEntry instanceof Throwable ? (Throwable)lastEntry : null;
} else {
return null;
}
}