善用Logging API:Part2
爪哇教室> 善用Logging API:Part2--使用Jakarta Commons Logging整合Log4j
(景文技術學院資管系 吳明哲)
一、前言:
之前我們已經學會如何使用Log4j,雖然Log4j是組功能強大的Logging函
式庫,但有時我們想讓我們的程式擁有更高的彈性,而不需限定在某一特
定的函式庫功能之上,為了解決這項問題,我們使用Jakarta Commons
Logging來達成這個目的。
二、什麼是Jakarta Commons Logging?
各位可以到以下網址取得詳細的資料
http://jakarta.apache.org/commons/logging.html
簡單的說Jakarta Commons Logging是一組小型而簡單的通用Log函式庫,簡
單的說,它是用來包覆(wrapper)多種Logging API的通用封包(package)
,也就是說我們可以透過它的介面來動態改變所使用的Logging函式庫而不
須改原來的程式碼。目前Commons Logging所支援的Logging API有:
1.Log4j(http://jakarta.apache.org/log4j)
2.Logkit(http://jakarta.apache/avalon/logkit)
3.JDK1.4 Logging(http://java.sun.com/)
4.Simplelog:使用標準的Stdout和Stderr
5.NoOpLog:忽略所有的Log訊息
三、取得與安裝:
1.你可以從可以的網址取得Commons Logging 目前最新的版本
http://jakarta.apache/commons/logging.html
2.解壓縮
3.將Commons-logging.jar放在你的classpath路徑中或WebApp/Web-INF/lib
路徑中
※注意:Commons-logging只包含Simplelog和NoOpLog的實作(implementation),
如果你想使用其它的Logging API,請先下載其它的函式庫
4.設定Common-logging.properties:
使用Common-logging之前,你必須先決定你的logging實作,以下幾種
方法可以讓你定義你的logging實作
(1)使用system properties來定義org.apache.commons logging.LogFactory:
例:java
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
MyApplication
(2)使用JDK1.3 JAR services Discovery機制:
在你的jar檔內放置META-INF/services/org.apache.commons.logging.LogFactory
並在第一行定義你要使用的實作
例:
(org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog)
(3)放置commons-logging.properties屬性檔和你的.class同一路徑裡,並在
其內加上一行
org.apache.commons.logging.Log=or.paache.commons.logging.impl.simpleLog
※這是最簡單的方法,也是我們要在本文介紹的方法
5.使用預設的實作來尋找使用那一種功能,其順序為:
(1)尋找system property
(2)使用org.apache.commons.logging.Log定義的值
(3)尋找Log4JCategoryLog
(4)是否使用JDK1.4,如果有則使用Jdk1.4 Logger
(5)最後則使用NoOpLog實作,也就是停用Log功能
四、使用與範例:
A1:撰寫以下程式碼
檔案:TestLog4j.java
//一開始我們需要匯入 import org.apache.commons.logging.LogFactory
//及import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
public class CommLogTest {
public static void main(String[] args) {
//從LogFactory中去初始化一個Log 的 實作(如Simplelog),我們的所有訊息
將會儲存在這個Log內
Log log = LogFactory.getLog(CommLogTest.class);
//以下分別使用Commons-Logging的6個層級來設定Log資訊
log.trace("這是 trace 層級資訊");
log.debug("這是 debug 層級資訊");
log.info("這是 info 層級資訊");
log.error("這是 error 層級資訊");
log.warn("這是 warn 層級資訊");
log.fatal("這是 fatal 層級資訊");
}
}
A2:請將一個檔名為commons-logging.properties的檔案放在跟.class(例:
CommLogTest.class)同一個目錄下
或WEB-INF/classes目錄底下其內容如下:
檔案:commons-logging.properties
#使用NoOpLog實作,停用Log功能
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
#使用SimpleLog實作,我們可以利用simplelog.properties來進行更進一步的控制
#本文一開始使用這組介面來顯示基本的Log訊息
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
#使用Log4JCategoryLog實作,我們可以利用Log4j來進行更進一步的控制
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
A3:因為我們目前使用Simplelog來處理我們的Log,所以我們需要另一個屬性
檔來對SimpleLog這個介面作進一步的設定,請將另一個檔名為simplelog.properties
的檔案放在跟.class同一個目錄下或WEB-INF/classes目錄底下其內容如下:
#預設 logging 的執行層級. 其選項必須是"trace", "debug", "info", "warn",
"error","fatal"其中一項.
#如果沒定義預設是 "info".
org.apache.commons.logging.simplelog.defaultlog=error
#特定SimpleLog instance 的 Logging 執行層級,我們必須指定其名稱,以本例
來說是SimpleTest#如果沒定義其值,預設是上面defaultlog 定義的值
org.apache.commons.logging.simplelog.log.CommLogTest=info
#設定輸出訊息中是否要包含class的名稱,以本例來就是CommLogTest. 預設
是false
org.apache.commons.logging.simplelog.showlogname=true
#設定以較短的格式輸出class的名稱,以本例來就是CommLogTest. 預設是true
org.apache.commons.logging.simplelog.showShortLogname=false
#設定輸出訊息中是否要包含目前的時間與日期. 預設是false
org.apache.commons.logging.simplelog.showdatetime=true
A3:輸出結果如下
C:CommLogTest>java CommLogTest
2003/03/12 01:02:49:727 PST [ERROR] 這是 error 層級資訊
2003/03/12 01:02:49:727 PST [WARN] 這是 warn 層級資訊
2003/03/12 01:02:49:727 PST [FATAL] 這是 fatal 層級資訊
五、進階使用-配合Log4j
從上面的輸出,大家可能會覺的輸出結果過於簡單,或是想要使用其他的
Logging API來取代預設的SimpleLog
接下來我們就繼續來介紹如何整合Log4j
A1:
(1)請將一個檔名為log4j.properties的檔案放在跟.class同一個目錄下或
WEB-INF/classes目錄底下其內容如下:
###############################################################
#設定 root logger 的層級為INFO 並且使用 SimpleConsole,RollingFile 二個Appende
log4j.rootLogger=INFO, SimpleConsole
# SimpleConsole 使用 PatternLayout 來作為輸出的格式
log4j.appender.SimpleConsole=org.apache.log4j.ConsoleAppender
log4j.appender.SimpleConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.SimpleConsole.layout.ConversionPattern=[%t] %-5p %c %d - %m%n
#######################################################
(2)將dist/lib/log4j-1.2.X.jar路徑增加到你的classpath 的環境變數中
(ex:C:/log4j/lib/lob4j),
或是放在WebApp/Web-INF/lib下
A2:請將commons-logging.properties內的屬性值修改成如下:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
改為
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
A3:輸出結果如下
C:CommLogTest>java CommLogTest
[main] INFO CommLogTest 2003-03-12 01:09:14,791 - 這是 info 層級資訊
[main] ERROR CommLogTest 2003-03-12 01:09:14,791 - 這是 error 層級資訊
[main] WARN CommLogTest 2003-03-12 01:09:14,791 - 這是 warn 層級資訊
[main] FATAL CommLogTest 2003-03-12 01:09:14,791 - 這是 fatal 層級資訊
※如果大家對如何使用Log4j有何疑問可以參考之前的文章
六、結尾:
使用commons-logging API,讓我們可以採用更具彈性的作法,來撰寫
我們的Log,目前Apache Jakarta專案下的各種子專案(如struts),
多已採用commons-logging API來建立自已的Log資訊,本文討論了如
何以commons-logging搭配Log4j,可以讓我們程式所產生的log同時具
有彈性及可讀性至於commons-loggin支援的其他實作(如JDK1.4 Logging)
的使用方法請各位有興趣可以參考其本身的JavaDoc。