Log4j

(史帝芬, 2005/8/20, hi.steven@gmail.com)
程式裡為了追蹤錯誤而寫一些log是很平常的事,最簡單的就是用System.out.println將log 寫到console或container指定的檔案,這個方法簡單,但是因提供的資訊不足,對於追蹤錯誤 通常不太夠,apache提供的Log4j是目前最流行的工具,因為它小巧卻又功能強大,底下將 簡單的介紹Log4j (這好像是我的風格?),如果要精通,可以參考官方網站的文件,官方網 站在http://logging.apache.org/log4j/docs/index.html。 在看程式前,先將由官網上下載的Log4j API解開,找到一個名為 log4j-x.y.z.jar的檔案,將它加入 classpath。我寫的程式只有一個TestLog4j.java及一個Log4j.properties設定檔,如下圖:
  • 測試程式
    package tw.idv.idealist;
    
    import java.io.IOException;
    import java.util.*;
    import org.apache.log4j.*;
    
    public class TestLog4j {
    
      static Logger logger;
    
      static public void main(String args[]){
    
        Properties logp = new Properties();
        try {
          logp.load(TestLog4j.class.getClassLoader()
            .getResourceAsStream( "tw/idv/idealist/Log4j.properties"));
        } catch (IOException e) {
          e.printStackTrace();
        }
    
        PropertyConfigurator.configure(logp);
        logger = Logger.getLogger("J2EE");
    
        logger.debug("Hello Log4j");
        logger.info("Hi Log4j");
      }
    }	
  • 設定檔
    log4j.rootLogger=INFO, A1, A2
    
    # A1 is set to be a ConsoleAppender.
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=
          [%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n
    
    # A2 is set to be a file
    log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.A2.layout=org.apache.log4j.PatternLayout
    log4j.appender.A2.layout.ConversionPattern=
          [%d{HH:mm:ss:SSS}][%C-%M] %m%n
    log4j.appender.A2.File=C:/temp/connector_agent_trace.log	
  • 執行結果
    在上面的設定檔設定成要輸出到console (A1)及檔案(A2),所以在console及C:/temp/connector_agent_trace.log都會有log輸出, 其結果如下:
    Console:
    [05/08/20 23:40:01:422][tw.idv.idealist.TestLog4j-main] Hi Log4j
    log檔:
    [23:40:01:422][tw.idv.idealist.TestLog4j-main] Hi Log4j
  • 說明
    1. 階層

    2. Log4j將輸出訊息分成五個等級,分別為DEBUG、INFO、WARN、ERROR、FATAL,在上面設定檔將輸出等級 設為INFO,就表示INFO~FATAL等級的訊息將會輸出,因此DEBUG等級的訊息就會被忽略,如果將設定檔的 第一行改為log4j.rootLogger=DEBUG, A1, A2,就會兩個訊息都輸出了。除了這五個等級外,也可以設為ALL或OFF, ALL很示全部訊息都輸出,OFF則表示不輸出訊息。
    3. 輸出格式

    4. # %c 輸出日誌訊息所屬的類別的全名
      # %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
      # %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
      # %m 輸出訊息,如log(message)中的message。
      # %n 輸出一個列尾符號。
      # %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
      # %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
      # %t 輸出產生該日誌事件的線程名。
      # %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
      # %f 輸出日誌訊息所屬的類別的類別名。
      值得注意的是A2的appender被設為org.apache.log4j.DailyRollingFileAppender表示Log4j會將日誌檔依日期分開。

  • See Also

  •     log4net