一、基本知識
下面一段是摘自域於java.util.logging JDK說明文檔中關於使用日誌的四個主要目標:
- 由終端使用者和系統管理員進行問題診斷。這由簡單的常見問題日誌組成,可在本地解決或跟蹤這些問題,如資源不足、安全失敗和簡單的配置錯誤。
- 由現場服務工程師進行問題診斷。現場服務工程師使用的日誌資訊可以相當複雜和冗長,遠超過系統管理員的要求。通常,這樣的資訊需要特定子系統中的額外日誌記錄。
- 由開發組織進行問題診斷。在現場出現問題時,必須將捕獲的日誌資訊返回到原Team Dev以供診斷。此日誌資訊可能非常詳細,並且相當費解。這樣的資訊可能包括對特定子系統進行內部執行的詳細跟蹤。
- 由開發人員進行問題診斷。Logging API 還可以用來協助調試正在開發的應用程式。這可能包括由目標應用程式產生的日誌資訊,以及由低層級的庫產生的日誌資訊。但是要注意,雖然這樣使用非常合理,但是 Logging API 並不用於代替開發環境中已經存在的調試和解析工具
本文主要基於第四點來描述如何利用JDeveloper 11g和ADFLogger來調試ADF應用中的業務組件。ADFLogger是ADF基於Java Logging API (java.util.logging.Logger)封裝的日誌工具。
java.util.logging.Level類中定義了一組可用來控制日誌輸出的標準記錄層級。日誌 Level 對象是有序的,並且是通過有序的整數來指定。
在給定的層級上啟用日誌記錄也就啟用了所有較進階別的日誌記錄,如下面的層級中,如果啟用了INFO層級,那更進階別的SEVERE和WARNING也被啟用了。
日誌按嚴重性由高到低的順序提供了如下的層級
- SEVERE 嚴重的錯誤,導致系統中止。期望這類資訊能立即顯示在狀態控制台上
- WARNING 潛在問題的層級,它是不符合預期的狀態但還不至於成為“錯誤”,例如使用了廢棄的API等等。期望這類資訊能立即顯示在狀態控制台上
- INFO 運行時產生的有意義的一些資訊,主要用於報告訊息的目的。期望這類資訊能立即顯示在狀態控制台上
- CONFIG 靜態配置訊息,用來輸出一些系統配置資訊。期望這類資訊僅被寫入記錄檔中
- FINE 指示提供跟蹤資訊,簡單輸出一些跟蹤資訊。期望這類資訊僅被寫入記錄檔中
- FINER 指示提供一條相當詳細的跟蹤訊息。期望這類資訊僅被寫入記錄檔中
- FINEST 指示提供一條最詳細的跟蹤訊息。期望這類資訊僅被寫入記錄檔中
二、編寫代碼
在ADF代碼中根據需求記錄日誌資訊,確保日誌資訊在內容上和反應問題的嚴重程度上的準確而且恰當,是程式員需要做好的重要任務。
如下是在一個EO的實作類別AfwkModulesVlEOImpl中記錄日誌資訊的代碼:
首先是建立一個日誌記錄器;然後輸出日誌資訊。
private static ADFLogger logger = ADFLogger.createADFLogger(AfwkModulesVlEOImpl.class);<br />logger.log(Level.INFO, "select language_code, installed_flag from afwk_languages where installed_flag in ('I', 'B')");<br />//logger.info("select language_code, installed_flag from afwk_languages where installed_flag in ('I', 'B')");
代碼中記錄日誌資訊可以採取兩種辦法:
- 使用log方法,通過指定Level參數來決定日誌資訊反映為哪個層級的嚴重程度。如上面代碼中logger.log方法
- 使用記錄層級的方法,什麼嚴重程度的層級就使用什麼樣的輸出方法。如上面代碼中被注釋掉的logger.info方法就是用來輸出INFO層級的日誌資訊
日誌記錄方法劃分為 5 個主要類別:
- 一系列的 "log" 方法,這種方法帶有記錄層級、訊息字串,以及可選的一些訊息字串參數。
- 一系列的 "logp" 方法(即 "log precise"),其與 "log" 方法相似,但是帶有顯式的源類名稱和方法名稱。
- 一系列的 "logrb" 方法(即 "log with resource bundle"),其與 "logp" 方法相似,但是帶有顯式的在本地化日誌訊息中使用的資源套件名稱。
- 還有跟蹤方法條目("entering" 方法)、方法返回("exiting" 方法)和拋出異常("throwing" 方法)的便捷方法。
- 最後,還有一系列在非常簡單的情況下(如開發人員只想為給定的記錄層級記錄一條簡單的字串)使用的便捷方法。這些方法按標準層級名稱命名("severe"、"warning"、"info" 等等),並帶有單個參數,即一個訊息字串。
如severe層級的方法有如下:
- severe(java.lang.String msg)
- severe(java.lang.String message, java.lang.Object param)
- severe(java.lang.String message, java.lang.Object[] params)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object param1)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object[] params)
- severe(java.lang.String message, java.lang.Throwable t)
- severe(java.lang.Throwable t)
其它的方法和方法的詳細資料可以查看Java Doc
三、偵錯工具
通過應用模組(Application Module)的操作功能表選擇Run或者Debug來測試回合業務組件,並根據實際組件進行資料操作:
操作之後查看Log Window的輸出資訊:
注意中輸出的日誌資訊:
1,綠色的日誌資訊屬於系統運行輸出的
2,紅色字型的日誌資訊則是在程式碼中記錄的。而紅色的日誌中,帶日期時間、包名和方法的那行是我們程式中輸出日誌所屬的上下文資訊,
而以“資訊:”打頭的才是真正我們代碼中輸出的日誌資訊,如紅色框所框住的資訊就是第二部分範例程式碼所輸出的日誌資訊。
注意:這種方式下,Log Window視窗中只輸出訊息層級高於INFO的日誌資訊,要查看低於這個層級的日誌資訊,需要配置ADFLogger的logging.xml檔案
使用ADFLogger日誌工具來進行程式的調試,這樣避免了在程式中使用System.out.println方法來列印資訊,也可以在產品交付的時候通過系統選項來控制
什麼樣層級的資訊需要輸出,而不是將任何程式的調試資訊也一併輸出。
如果我們希望除了看到程式中的日誌資訊,還希望查看一下運行時的診斷資訊,可以啟用診斷記錄來輸出相關資訊。
在回合組態器的JVM選項中添加:
-Djbo.debugoutput=console
這樣日誌視窗中就會列印出很詳細的診斷資訊,主要包括
- 作業系統資訊
- Java虛擬機器資訊
- 建立BindingContext資訊
- 裝載BC4J屬性
- 建立資料庫連接資訊
- 建立業務實體資訊
這樣的資訊可以協助我們進行一些疑難雜症的解決。
在Oracle ADF應該開發過程中,JDeveloper 11g開發工具提供了很多的調試方式和工具,隨著後續學習的深入,將記錄更多的調試方法。
本文轉自Oracle Seeker:http://oracleseeker.com/2008/11/20/debugging_adf_business_component_by_adflogger/