從jdk 1.4開始,SUN在標準API裡面加入了一組package javax.util.logging,用來提供log的能力。對於一個好的軟體來說, log是很重要的,透過log我們可以知道軟體在執行過程有發生 什麼問題,從而作修改或調整。當然,要製作log並不一定要 透過標準的API,很單純的System.out.println或System.err.println 也是一種log,只是沒有使用標準API的結果,造成程式不好維護, 一大堆的println也會讓程式的可讀性降低。透過標準的API,不但 程式容易瞭解,甚至在deploy之後,還可以透過動態的設定決定 執行期實際的log行為,的確有不少的優點。 javax.util.logging這組API將logging的工作由三大部分組成:Logger、 Handler、Formatter。Logger是位於最上層的,programmer直接對 Logger做操作。而Handler是實際負責logging的動作,每一個Logger 都可以註冊數個Handler,當Logger的logging函式被呼叫的時候, 資料會被送到註冊的Handler作處理。至於Formatter則是負責formatting 的動作,將logging的訊息做成XML或其他的樣式。此外,對於Logger 和Handler都可以設定Level,這個Level是用來代表logging訊息的層級, 低於此Level的訊息就會被忽略掉。 另外要注意的一點是,所有的Logger是有名字的,而且是hierarchical 的naming,這意味著Logger之間有相互繼承的關係,舉例來說,一個 名稱是"test.logger"的Logger會從一個名稱是"test"的Logger繼承包括Level 設定的許多屬性,當然可以直接繼承也可以override這些屬性。除了繼承 之外,由於Logger會把logging的資訊上一層的parent傳送,所以當我們對 某一個Logger呼叫了log的函式之後,這個動作也會被傳送到這個Logger 的所有parent。也因此,我們並不需要對一個底層的Logger註冊Handler, 可以由parent Logger的Handler來處理訊息即可。反過來說,如果我們對 所有的Logger都註冊了Handler,那麼一個logging的訊息可能會被輸出 許多次。至於最上層的root Logger的名稱是"",相關的設定值被儲存在 JRE安裝路徑底下的logging.properties檔案中。 我們來看一個簡單的example,其他心得我們下次再繼續討論: ============================================================ import javax.util.logging.*; public class testLogging { public static void main(String args[]) throws Exception { Logger logger=Logger.getLogger("");//直接使用root Logger if(args.length!=1) logger.warning("the number of parameters is wrong!!"); } }