Java打印完整的堆棧信息

Java print full StackTrace

咱們在編寫一些組件時,使用的日誌系統有時並不能打印完整的堆棧信息,好比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))
相關文章
相關標籤/搜索