我捕获了一个异常,想要将堆栈跟踪信息写入日志中,代码如下:
log.warn(e.getMessage());
但是它所说的只有这些
null
所以我把它改成了
log.warn(e.toString());
现在它只说
java.lang.NullPointerException
我该如何将完整的堆栈跟踪信息写入日志,以便查看在应用程序中生成这个异常的位置?
我捕获了一个异常,想要将堆栈跟踪信息写入日志中,代码如下:
log.warn(e.getMessage());
但是它所说的只有这些
null
所以我把它改成了
log.warn(e.toString());
现在它只说
java.lang.NullPointerException
我该如何将完整的堆栈跟踪信息写入日志,以便查看在应用程序中生成这个异常的位置?
通常情况下:
log.warn("message", e);
但这也取决于您所使用的日志框架。
标签
logger.log(Level.WARN, "logged exception", ex);
或者
logger.warn("logged exception", ex);
资源:
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是要记录堆栈跟踪的异常(throwable)。
另一种选择是使用commons-logging,但其用法相同:
log.error("Message", exception);
通过java.util.logging,可以进行如下操作:
logger.log(Level.SEVERE, "Message", exception);
String
是null
。e
不为null,但是Throwable
类的detailMessage
私有实例变量为null,这就是为什么e.getMessage()
是字符串null
,但是e.toString()
(调用底层的null detailMessage.toString
)会抛出NullPointerException
。 LOGGER.error("Error al recuperar proveedores de la base de datos: " +
e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
@Override
public Object apply(Object t) {
return t.toString();
}
}).collect(Collectors.joining("\n")));