我捕获异常,并努力写出这样的堆栈跟踪日志:如何将完整的堆栈跟踪写入日志?
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);
资源:
在你的异常的方法,所述底层String
包含讯息是null
。
以上回答,现在剔除,仍持有,但e
不为空,但对Throwable
类detailMessage
私有实例变量为空,这就是为什么e.getMessage()
是字符串null
,但e.toString()
(其中调用底层nulldetailMessage.toString
)抛出NullPointerException
。
也许您正在寻找这样的事情: http://www.javapractices.com/topic/TopicAction.do?Id=78
使用log4j的,这是与完成:
logger.error( “出现错误”,除外); 第一个参数是要显示的消息,第二个参数是堆栈跟踪记录的异常(可抛出)。
另一种选择是共享记录,在那里它是相同的:
log.error( “消息”,例外);
logger.log(等级:
随着java.util.logging中这可以通过来完成。SEVERE,“消息”,例外);
如果您使用java8你可以做到以下几点:
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
它工作得很好,而且在调试会话期间,当异常没有正确记录时它也很有用。 – alexandrul 2017-10-18 12:38:57
如果您使用的是Java版本之前的8,你可以试试这个:
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为空,登录。警告(e.getMessage());会抛出异常并且不会打印“null”。 – 2010-09-15 11:49:41
不,不会,它会抛出一个NPE – 2010-09-15 11:50:16
对不起,我误读你的评论 – 2010-09-15 12:02:54