[英]How do you write a full stack trace to the log?
我正在捕获异常并尝试将堆栈跟踪写入日志,如下所示:
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);
资源:
使用 log4j,这是通过以下方式完成的:
logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是记录堆栈跟踪的异常(可抛出)。
另一种选择是 commons-logging,它是相同的:
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"))
);
在您的异常方法中,包含消息的基础String
是null
。
上面的答案,现在被剔除,仍然成立,除了e
不为 null,但Throwable
类上的detailMessage
私有实例变量为 null,这就是为什么e.getMessage()
是 String null
,而e.toString()
(调用底层null detailMessage.toString
)抛出NullPointerException
。
如果你使用的是 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")));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.