Java 如何将完整堆栈跟踪写入日志?
我捕获了一个异常,并尝试将堆栈跟踪写入日志,如下所示:Java 如何将完整堆栈跟踪写入日志?,java,stack-trace,Java,Stack Trace,我捕获了一个异常,并尝试将堆栈跟踪写入日志,如下所示: log.warn(e.getMessage()); 但它所说的只是 null 所以我把它改成了 log.warn(e.toString()); 现在它只说 java.lang.NullPointerException 如何将完整堆栈跟踪写入日志,以便查看在应用程序中生成此异常的位置?通常: log.warn("message", e); 但这也取决于您的日志框架。您可以使用 logger.log(Level.WARN, "logg
log.warn(e.getMessage());
但它所说的只是
null
所以我把它改成了
log.warn(e.toString());
现在它只说
java.lang.NullPointerException
如何将完整堆栈跟踪写入日志,以便查看在应用程序中生成此异常的位置?通常:
log.warn("message", e);
但这也取决于您的日志框架。您可以使用
logger.log(Level.WARN, "logged exception", ex);
或
资源:
字符串是null
上面的答案现在被删除了,除了e
不是null,但是Throwable
类上的detailMessage
私有实例变量是null,这就是为什么e.getMessage()
是字符串null
,而e.toString()
(调用底层nulldetailMessage.toString
)使用log4j抛出NullPointerException
,这是通过以下方式完成的:
logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是记录stacktrace的异常(throwable)
另一个选项是commons日志记录,它是相同的:
log.error("Message", exception);
通过java.util.logging,可以通过以下方式完成此操作:
logger.log(Level.SEVERE, "Message", exception);
如果使用Java 8,可以执行以下操作:
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
如果您使用的是8之前的Java版本,可以尝试以下方法:
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")));
如果e为null,log.warn(e.getMessage());将抛出异常,并且不会打印“null”。不,它不会,它将抛出一个NPEIt,它可以正常工作,并且在异常未正确记录的调试会话期间也很有用。我体验到上面的处理比log.error(“message”,e)慢得多;我已经试过调试会话,值得一试,特别是如果您编写了一个全局处理程序。Arrays.asList(…)。stream()可以简化为Arrays.stream(例如getStackTrace())
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")));