[英]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.