使用日誌功能(JDK Log 或 Log4J)時,日誌系統自動列印豐富資訊,格式如:[運行時間] [當前類名] [方法名] INFO: [用戶資訊]。例如 Tomcat 啟動資訊:Jul 9, 2004 11:22:41 AM org.apache.coyote.http11.Http11Protocol start INFO: Starting Coyote HTTP/1.1 on port 8080。類名與方法名非用戶手動添加,而是日誌系統自動判斷當前執行語句所屬類別與方法。這是如何做到的?
Throwable.printStackTrace() 調用 native printStackTrace0(),無法直接在 Java 程式碼中使用。唯一辦法:建立 new Throwable() 獲取堆疊追蹤字串,自行解析提取所需資訊。Log4J 1.2 即採此法:t.printStackTrace(pw) 獲取字串,解析第 5 行(跳過 Log4J 內部 4 層調用)獲取呼叫者類名、方法名、檔名、行號。
為免解析字串麻煩,JDK 1.4 引入 StackTraceElement 類別,包含 declaringClass、methodName、fileName、lineNumber。JDK 1.4 Log 實作:(new Throwable()).getStackTrace() 獲取陣列,搜尋 Logger 類別後的第一個框架即為呼叫者。Log4J 1.3 alpha 兼容兩者:判斷平台支援 StackTraceElement 時用 StackTraceElementExtractor,否則用 LegacyExtractor。
JDK 1.5 在 Thread 類別引入 getStackTrace() 與 getAllStackTraces() 兩方法。無需 (new Throwable()).getStackTrace(),可調用 Thread.currentThread().getStackTrace() 獲取當前執行緒堆疊資訊。權限允許時還可獲取其他執行緒堆疊資訊。getStackTrace() 回傳 StackTraceElement[],第一個元素為堆疊頂端(最近方法呼叫),最後一個為底部。getAllStackTraces() 回傳所有存活執行緒堆疊追蹤的 Map。
從總體發展趨勢看,JDK 不僅提供越來越多、越來越強功能,且暴露給用戶的控制方法越來越多、越來越強大。
文章來源:https://blog.csdn.net/buaawhl/archive/2005/01/18/257653.aspx