整合 WebSphere v5.x 與 Jakarta Commons Logging

摘要:整合 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 元件,必須執行下列步驟:

  1. 在 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
    
  2. 把 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