我捕獲異常,並努力寫出這樣的堆棧跟蹤日誌:如何將完整的堆棧跟蹤寫入日誌?
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