LOG4J 入門
這樣就可把代碼中要用System.out.println()輸出調試信息的地方全用Debug.println()替代,當在發佈時只需把Debug類中的debugOn改成false即可。這樣做雖然在一定程度上解決了問題,但如果需要的是更復雜的日誌系統呢,比如把日誌信息保存爲文件等別的形式;又或是當系統在試運行了一段時間後我們又要更改某些試運行時的測試信息。如果真的遇到這樣的情況,也行就只有修改代碼了,這樣又給開發工作帶來了麻煩。
Log4J是Apache軟件基金會Jakarta項目下的一個子項目,是用Java編寫的優秀日誌工具包。通過Log4J可以在不修改代碼的情況下,方便、靈活地控制任意粒度的日誌信息的開啓或關閉,然後使用定製的格式,把日誌信息輸出到一個或多個需要的地方。並且,Log4J還有一條平滑的學習曲線,在三分鐘內就可學會它的簡單使用。隨着使用深入,你會發現Log4J功能的強大,幾乎可以滿足日誌方面的所有需要。
第一個log4j程序及其原理
1 第一個log4j程序
讓我們從現在開始記時,看完成第一個log4j程序要不要3分鐘。首先log4j-1.2.7.jar考到你的類路徑下。然後創建一個類,代碼如下:
- package TestLog4j;
- import org.apache.log4j.Logger;
- import org.apache.log4j.BasicConfigurator;
- import org.apache.log4j.PropertyConfigurator;
- import org.apache.log4j.Priority;;
- public class TestLog4j
- {
- //代碼(1)
- static Logger logger = Logger.getLogger(TestLog4j.class.getName());
- public TestLog4j(){}
- public static void main(String[] args)
- {
- //代碼(2)
- BasicConfigurator.configure();
- //代碼(3)
- logger.debug("Start of the main() in TestLog4j");
- logger.info("Just testing a log message with priority set to INFO");
- logger.warn("Just testing a log message with priority set to WARN");
- logger.error("Just testing a log message with priority set to ERROR");
- logger.fatal("Just testing a log message with priority set to FATAL");
- logger.log(Priority.DEBUG, "Testing a log message use a alternate form");
- logger.debug("End of the main() in TestLog4j");
- }
- }
最後運行這個類,你就會看到運行結果爲:
0 [main] DEBUG TestLog4j.TestLog4j - Start of the main() in TestLog4j
10 [main] INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
10 [main] WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
21 [main] ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
21 [main] FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL
111 [main] DEBUG TestLog4j.TestLog4j - Testing a log message use a alternate form
111 [main] DEBUG TestLog4j.TestLog4j - End of the main() in TestLog4j
好了,看一看你的表,應該不到3分鐘吧。在這短短的3分鐘裏,我們做了些什麼呢?下面我們來分析一下代碼。
1) 首先代碼(1)先通過Logger類的getLogger()方法得到一個Logger類的對象。在getLogger()方法中,通常把所在的類的Class對象或是所在類的全名作爲參數。運用log4j輸出日誌要用到Logger對象。
2) 然後代碼(2)進行一些必要的初始化,如要把調試信息輸出到哪。當用System.out.println()時可以很明確的知道要把信息輸出到標準輸出設備且只能輸出到那裏。運用log4j,我們可以輸出到許多地方,如控制檯、文件、HTML文件等,至於要輸出到哪裏,就要自己進行初始化。在代碼(2),我們調用自帶的初始化方法來完成初始化。用這個方法進行初始化就不能體現出log4j的靈活性,所以基本上不會這樣做。Log4j提供了用XML文件或Java配置文件來配置設置的方法,在下面我們將進行介紹。
3) 接着代碼(3)就是輸出信息的代碼了。你可以看到代碼(3)中嘗試了用幾種不同的方法來輸出信息,對於這幾種信息的作用,我會在下面進行介紹,你現在只需把它當成是輸出語句就行。
最後,我們來看一下運行結果(日誌信息)的意義。第一個數字是指程序開始運行到運行該日誌語句所經歷的毫秒數(用來做一點運行效率分析也不錯),“[main]”是日誌事件發生的線程,隨後的“DEBUG”、“INFO”等信息是相應日誌信息的優先級別,“TestLog4j.TestLog4”是當前TestLog4所在的包和名稱,最後是日誌信息。
2 實例原理
雖然完成了第一程序了,但程序中的內容還是不太瞭解。好,現在我就對上面的例子用到的log4j的原理進行講解。在以後的章節中,我都會採取這種先實例,再根據實例來介紹所涉及的log4j原理的方法。
2.1 記錄器Logger
Logger類是在log4j1.2以後纔有的,以前是用Category類來實現現在的Logger類的功能的。從API可知,Logger類是Category類的子類。Logger類的代碼如下:
- package org.apache.log4j;
- public class Logger {
- // 創建和取回方法:
- public static Logger getRootLogger();
- public static Logger getLogger(String name);
- public static Logger getLogger(Class class1);
- // 打印方法:
- public void debug(Object message);
- public void info(Object message);
- public void warn(Object message);
- public void error(Object message);
- public void fatal(Object message);
- // 常用打印方法:
- public void log(Level l, Object message);
- }
在討論Logger類中的方法之前,我先講一下log4j中的級別(level)的概念。
2.1.1 級別Level
Log4j中的日誌級別分爲五種:DEBUG、INFO、WARN、ERROR和FATAL,這五種級別從左到右級別依次增加。
2.1.2 Logger中的打印函數與級別
對於每一個記錄器,我們都可對它賦於一定的級別,而打印函數打印的即是相應級別的信息。當對一個級別爲A的Logger調用級別爲B的打印方法時,只有當B>=A時纔會進行打印。例如,如果有一個級別爲WARN的Logger對象logger,只有對它調用logger.warn (message)、logger.error (message)和logger.fatal (message)這三個打印函數纔會打印信息;而調用logger.debug (message)和logger.info (message)則不會打印信息,因爲debug()函數只有當logger的級別爲DEBUG時纔打印信息,info()函數只有當logger的級別爲INFO時纔打印信息。
除了對應於每一個級別有一個打印函數外,在Logger類中還有一個log(),它可以讓你通過參數來指定一個打印信息的打印級別。
引入級別後就可通過修改調試的級別來控制某個調試信息是否輸出。假設我們有的信息是在開發時才需要輸出的(稱爲測試信息),那麼我們把輸出測試信息的Logger的級別在開發時設爲DEBUG級別的,並用debug(Object message)函數來進行打印。當要發佈系統時,只需把相應的Logger的級別調高就可以屏蔽掉測試信息。