2009-06-25 59 views
40

我需要編寫一個小型日誌分析器應用程序來處理由我的項目中使用的第三方封閉源庫(內部具有自定義記錄器)生成的一些日誌文件。在printStackTrace()上打印完整調用堆棧?

如果日誌條目中存在異常,我需要收集有關堆棧跟蹤中涉及的方法的彙總信息,從頂部到異常的實際位置。

不幸的是,默認情況下,Java printStackTrace()不會打印調用堆棧中的每個方法,但是達到一定的數量,其餘的僅被引用爲16 more...

如果我自己能夠捕獲異常,我會使用getStackTrace()並自己打印它,但根本原因從未包含在此庫引發的異常中。

有沒有辦法讓Java打印堆棧跟蹤中的整個調用堆棧?

除了我的情況,常見的日誌記錄框架有這個選項嗎?

編輯:該程序在JDK 1.5.0_09的Sun JVM上運行。無法改變這一點。

+1

的[如何停止蹤跡在日誌截斷(http://stackoverflow.com/questions/437756/how-do-i-stop-stacktraces-truncating-in-logs) – 2016-03-22 20:31:46

回答

28

的「致」和here is an explanation「... ñ更」在印刷軌跡線。另請參閱JavaDoc for printStackTrace。你可能沒有任何工作要做。

請注意包含字符「...」的行的存在。這些行指示此異常的堆棧跟蹤的其餘部分與由異常導致的異常(「封閉」異常)導致的異常堆棧跟蹤底部的指定幀數相匹配。這種簡寫可以在常見情況下大大減少輸出的長度,在這種情況下,捕獲的異常是由與引發「引發異常」的方法相同的方法拋出的。

6

難道你不能用Thread.currentThread().getStackTrace()做點什麼嗎?

下面是一個簡單的實例,它遞歸地調用一個方法20次,然後轉儲出當前線程的堆棧。

public class Test { 
    public static void main(String[] args) { 
     method(); 
    } 

    static int x = 0; 
    private static void method() { 
     if(x>20) { 
      StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 

      for(int i=0; i<elements.length; i++) { 
       System.out.println(elements[i]); 
      } 
     } 
     else { 
      x++; 
      method(); 
     } 
    } 
} 
+4

報價可能重複: 「如果我自己能夠發現異常,我會使用getStackTrace()並自己打印它」 – akarnokd 2009-06-25 11:45:50

+0

因此,您無論如何都無法控制代碼?你只是在看日誌文件?重新讀你的問題,我想不是。道歉!如果有人發現它有用,我會將源代碼發佈。 – 2009-06-25 12:18:55

+0

它是一些傳統操作的第三方庫。甚至無法JAD它沒有錯誤。根據akf的回答,我可能只是誤解了堆棧跟蹤打印格式。我很少有以編程方式分析堆棧跟蹤的任務。 – akarnokd 2009-06-25 12:26:46

0

可能是你可以嘗試通過遍歷返回的數組了:

Thread.currentThread().getStackTrace();