2013年3月28日 星期四

Log4j 1.2.17

之前都僅只是使用,沒有真正自己去了解 Log4j ,該是來筆記一下的時候了!
到目前為止,Log4j 一直都昰做過的專案中必要的 log 機制,下面記錄一下使用方法及環境建置:
    取得 Log4j
    Download: http://logging.apache.org/log4j/1.2/download.html (目前版本為1.2.17)
    下載完成後解壓縮到自己想存放的位置。
     在 eclipse new 一個 Java Project
     輸入 Project Name 後,Next
    選擇 Libraries 頁面
    接下來要加入 Log4j 的 jar 檔。
    點選 Add External JARs...
    選擇 jar 檔的位址。
    完成後,可在 Project 的 Referenced Libraries 看到已加入的 log4j-1.2.17.jar
    Log4j 支援 Properties 檔及 XML 檔二種設定方式。
    在 apache-log4j-1.2.17\examples\lf5 下有 InitUsingLog4JPropertiesInitUsingPropertiesFile 二個範例,可將其中的 java 檔及設定檔複製到 Project 中當練習。
    有錯誤是因為 package 不正確,刪除就行了。
    接下來來看一下 InitUsingLog4JProperties 這個例子
    example.properties 內容如下
    log4j.rootCategory 可設定 root 這個 Category 的訊息等級及使用哪個Appender,root 的訊息等級未設定的話,log4j 預設為 DEBUG 等級。
    log4j.appender.A1 設定這個 Appender 以何種方式輸出 log。
    log4j.appender.A1.MaxNumberOfRecords 限制最大的 log 筆數。
    按下執行。
    得到以 org.apache.log4j.lf5.LF5Appender 方式輸出的 log。可以注意到的是,輸出的 log 僅包含 DEBUG 等級以上的 log。

    Log4j 設定檔

    再來說明一下 Log4j 設定檔設定方法。Log4j 的設定檔內容主要由 Loggers, Appenders 及 Layouts 三個部份組成。

    Loggers

    1. 是用來設定需要有哪幾組 log,其命名有大小寫之分。
    2. 當 logger 的命名中有包含 . (dot) 時,logger 則有階層關係;如 java 是 java.util 的父階層。
    3. 而 root logger 是所有 logger 的最上層,不需宣告,永遠存在。
    4. logger 如未指定等級,則向上找父階層中,第一個有指定的等級,並繼承。
    5. 輸出 log 時,需指定等級。如:c.info("..") 表示此 log 僅於 logger 等級設定在 info 等級上時,才會寫出。
    6. 等級大小:DEBUG < INFO < WARN < ERROR < FATAL

    Appenders 及 Layouts

    1. Log4j 可以輸出到多個目的地,Appender 主要就是用來設定輸出的目的地。
    2. Appender 的輸出方式有:console, files, GUI components, remote socket servers, JMS, NT Event Loggers, and remote UNIX Syslog daemons. It is also possible to log asynchronously.
    3. 常用的Appender:
      org.apache.log4j.ConsoleAppender(輸出到 console 介面)
      org.apache.log4j.FileAppender(輸出到檔案)
      org.apache.log4j.DailyRollingFileAppender(到達指定的時間區間產生一個新 Log 檔案)
      org.apache.log4j.RollingFileAppender(到達指定大小的時候會產生一個新 Log 檔案)
    4. 每個 Logger 可以附加一個以上的 Appender。
    5. 父階層 Logger 的 Appender 會繼承到子階層 Logger 上,如:root Logger Appender 輸出到 Console,則所有的 Logger 皆會輸出到 Console。若將該 Logger 的 Additivity 屬性設定為 false,則不會繼承來自父階層的 Appender。Additivity 預設值為 true。
    6. Appender 可以指定輸出的模式:
      org.apache.log4j.HTMLLayout(以HTML表格模式輸出)
      org.apache.log4j.PatternLayout(以模式字串靈活的設定)
      org.apache.log4j.SimpleLayout(輸出訊息等級及訊息內容)
      org.apache.log4j.xml.XMLLayout(輸出為 XML 格式)
    7. PatternLayout 可以 ConversionPattern 參數來設定輸出格式:
      %c 輸出日誌訊息所屬 category 的全名。可加括號指定僅輸出右邊算來幾層的名稱。
        如:category name "a.b.c" the pattern %c{2} will output "b.c". (輸出最右方的二層)
      %C 輸出訊息寫出的 class 全名。可加括號指定僅輸出右邊算來幾層的名稱。
        如:class name "org.apache.xyz.SomeClass", the pattern %C{1} will output "SomeClass".
        註:此參數效能不佳,應避免使用。
      %d 輸出日誌時間點的日期或時間,指定格式的方式。
        如: %d{yyyy-MM-dd HH:mm:ss,SSS}。
      %F 輸出日誌訊息所屬的類別的類別名。註:此參數效能不佳,應避免使用。
      %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
      %m 輸出訊息,如 log(message) 中的 message。
      %n 輸出一個換行符號。
      %p 輸出優先階層,即DEBUG、INFO、WARN、ERROR、FATAL。如果是用 debug()輸出的,則為DEBUG,依此類推。
      %r 輸出自程式啟動到輸出該日誌訊息所耗費的毫秒數。
      %t 輸出產生該日誌事件的線程名。
      %% 輸出一個百分號。
    8. ConversionPattern 可以在%與模式字元之間加上格式化符號來控制其最小寬度、最大寬度、和文本的對齊方式:
      1) %20c:指定輸出 category 的名稱,最小的寬度是20,如果名稱長度小於20的話,左邊自動以空白字元補滿。
      2) %-20c:指定輸出 category 的名稱,最小的寬度是20,如果名稱長度小於20的話,右邊自動以空白字元補滿。
      3) %.30c:指定輸出 category 的名稱,如果名稱長度大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。
      4) %20.30c:指定輸出 category 的名稱,如果名稱長度小於20 ,左邊自動以空白字元補滿;如果其名稱長於30字符,會將左邊多出的字元截掉。
      5) %-20.30c:指定輸出 category 的名稱,如果名稱長度小於20 ,右邊自動以空白字元補滿;如果其名稱長於30字符,會將左邊多出的字元截掉。

    沒有留言: