摘要:整合 WebSphere v5.x 與 Jakarta Commons Logging
作者:蔡煥麟
日期:Mar-26-2005
摘要
本文說明在 IBM WebSphere Application Server 5.x 中使用 Jakarta Commons Logging 時會碰到的問題、原因、以及解決方法。
問題
在 Web 應用程式中使用 Jakarta Commons Logging(以下簡稱 JCL)搭配 log4j 輸出日誌訊息,雖然程式編譯都沒有錯誤,但是發現輸出的 log 訊息不是由 log4j 丟出來的,而是來自一個叫做 TrLog 的類別,而且你的 log4j.properties 屬性檔中的設定完全沒有作用。JSP 程式碼如下:
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5" import="org.apache.commons.logging.Log"
import="org.apache.commons.logging.LogFactory" %> <% Log logger = LogFactory.getLog(this.getClass()); %> <HTML> <HEAD><TITLE>TestLog4j.jsp</TITLE></HEAD> <BODY> <% System.out.println(logger.getClass().getName());
logger.info("Debug message.");
%> </BODY> </HTML>
此 JSP 程式執行時,會將目前 JCL 所建立的 Log 物件所屬的類別名稱輸出到 System.out,亦即 stdout,由此可看出 JCL 的日誌工廠實際上建立的 log 物件是 TrLog 類別。
註:關於如何在 Web 應用程式中使用 Jakarta Commons Logging 與 log4j,可參考 [2]。 |
原因
WebSphere 內建了一個 TrLogFactory 的日誌工廠(logging factory),當你嘗試在你的 Web 應用程式中使用 Jakarta Commons Logging 元件來記錄日誌時,WebSphere 還是會用它內建的 TrLog 類別來輸出日誌訊息。
解法
如果要讓 WebSphere 改用你指定的 logging 元件,必須執行下列步驟:
- 在 commons-logging.properties 屬性檔裡面指定你想要使用的日誌工廠及日誌類別,例如:
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
- 把 Web 應用程式的 Classloader Mode 由 "PARENT_FIRST" 改成 "PARENT_LAST"。
這個步驟主要是告訴 WebSphere:不要先用你 (WebSphere)提供的類別,先用我的。
WebSphere 的設定方法:
使用瀏覽器進入 Admin Console,到〔應用程式 > 企業應用程式〕中點選你的應用程式,然後進入「Web 模組」,進入把「類別載入器模式」改成 "最後載入母項"。
WSAD 的設定方法:
開啟伺服器的內容,切到〔應用程式〕頁夾,然後從「應用程式」清單裡面選擇你的 Web 應用程式,再將「類別載入器模式」改成 "PARENT_LAST"。
注意: EAR 模組跟 WAR 模組都有 Classloader Mode 選項,第 2 個步驟所修改的 Classloader Mode 是 Web 模組的,注意不要改到 EAR 模組的選項,我試過這樣會引發一些問題:當你的程式用到的 3rd-party 類別庫(.jar)裡面就有包含 JCL 和 log4j 類別時(例如:Proxool),輸出日誌的工作可能會被它搶去,因而導致你程式輸出的 log 訊息完全都看不到。 |
IBM 提供的技術文件中提供了三種方法 [1],這裡提供的方法是其中的第三種,也是建議採用的方法,因為這種方法只會影響個別的 Web 應用程式。
參考資料
1 | Integrating Jakarta Commons Logging (JCL) with IBM WebSphere Application Server V5.0 releases http://www-1.ibm.com/support/docview.wss?uid=swg27004610 |
2 | 在 Web 應用程式中使用 Jakarta Commons Logging 與 Log4j http://huanlin.dyndns.org/techshare/viewArticle.action?articleID=2005032301 |