2012-04-11 48 views
2

假設我想反映日誌中的異常。在記錄日誌時異常情況很好?

我是否應該將堆棧跟蹤傳遞到log.error()或只是異常的toString()?或者做更好的事情?

如何獲取堆棧跟蹤字符串傳遞給記錄器?

回答

5

所有現代的日誌框架請客通過Exception對象特殊:

log.error("Danger! High Voltage!", ex); 

框架(讓它成爲)將很好地格式化堆棧跟蹤你。總是記錄完整的堆棧跟蹤,除非你知道你在做什麼。否則,你總是可以從給定的記錄器中過濾出異常。

另請注意,許多重要的例外不提供有意義的消息,NullPointerException是重要的例子。

+3

+1用於使用'[tag:java]'在回答中學習標籤'! – 2012-04-11 12:01:14

+0

@MartijnCourteaux:是的,我非常喜歡這個功能,另請參閱:http://meta.stackexchange.com/questions/123799 – 2012-04-11 12:03:10

1

我會去記錄整個堆棧跟蹤當然。以這種方式找到它更容易。

我不知道你用的是什麼庫記錄,但如果它不支持記錄異常,你可以得到的堆棧跟蹤作爲一個字符串是這樣的:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PrintStream ps = new PrintStream(baos); 
exception.printStackTrace(ps); 
ps.close(); 
String stacktrace = baos.toString(); 
0

當使用像log4j,有一個例外一個額外的參數,所以你通常寫的是這樣的:

catch(Exception e){ 
    logger.error("some message", e); 
} 

的Log4j將打印堆棧跟蹤的照顧。

有一點要記住(至少log4j的)是這樣的:當你不希望記錄的消息,但只是例外,您必須使用:

logger.error("", e); 

logger.error(e); // bad usage! This uses e.toString()!!