咱們在編寫一些組件時,使用的日誌系統有時並不能打印完整的堆棧信息,好比slf4j,log4j,咱們在調用log.error("found error ...",e)
打印異常時,只打印一行異常信息。咱們看下slf4j的源碼日誌
/** * Log an exception (throwable) at the ERROR level with an * accompanying message. * * @param msg the message accompanying the exception * @param t the exception (throwable) to log */ public void error(String msg, Throwable t);
它在打印exception時,只是打印了堆棧當中的第一行Throwable
的信息, 而咱們想要的是把整個堆棧都打印出來,這時咱們會用下面方式打印堆棧信息。code
e.printStackTrace()
這雖然打印了完整的堆棧信息,但它並不會把堆棧信息定向到日誌文件中,這時咱們就須要利用利用輸出流把信息從新定到變量中,而後再送入到日誌系統中get
/** * 完整的堆棧信息 * * @param e Exception * @return Full StackTrace */ public static String getStackTrace(Exception e) { StringWriter sw = null; PrintWriter pw = null; try { sw = new StringWriter(); pw = new PrintWriter(sw); e.printStackTrace(pw); pw.flush(); sw.flush(); } finally { if (sw != null) { try { sw.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (pw != null) { pw.close(); } } return sw.toString(); }
而後咱們這樣調用就解決了這個問題源碼
log.error("fount error...", getStackTrace(e))