2010-09-15 113 views
12

我捕獲異常,並努力寫出這樣的堆棧跟蹤日誌:如何將完整的堆棧跟蹤寫入日誌?

log.warn(e.getMessage()); 

但是,所有這說的是

null 

所以我改成了

log.warn(e.toString()); 

而現在它只說

java.lang.NullPointerException 

如何將完整堆棧跟蹤寫入日誌,以便我可以看到應用程序中正在生成此異常的位置?

回答

28

一般:

log.warn("message", e); 

但是這取決於你的日誌框架了。

3

在你的異常的方法,所述底層String包含訊息是null

以上回答,現在剔除,仍持有,但e不爲空,但對ThrowabledetailMessage私有實例變量爲空,這就是爲什麼e.getMessage()是字符串null,但e.toString()(其中調用底層nulldetailMessage.toString)拋出NullPointerException

+1

如果E爲空,登錄。警告(e.getMessage());會拋出異常並且不會打印「null」。 – 2010-09-15 11:49:41

+0

不,不會,它會拋出一個NPE – 2010-09-15 11:50:16

+0

對不起,我誤讀你的評論 – 2010-09-15 12:02:54

1

使用log4j的,這是與完成:

logger.error( 「出現錯誤」,除外); 第一個參數是要顯示的消息,第二個參數是堆棧跟蹤記錄的異常(可拋出)。

另一種選擇是共享記錄,在那裏它是相同的:

log.error( 「消息」,例外);

logger.log(等級:

隨着java.util.logging中這可以通過來完成。SEVERE,「消息」,例外);

1

如果您使用java8你可以做到以下幾點:

 LOGGER.error("Caught exception while methodX. Please investigate: " 
       + exception 
       + Arrays.asList(exception.getStackTrace()) 
       .stream() 
       .map(Objects::toString) 
       .collect(Collectors.joining("\n")) 
     ); 
+0

它工作得很好,而且在調試會話期間,當異常沒有正確記錄時它也很有用。 – alexandrul 2017-10-18 12:38:57

0

如果您使用的是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")));