————————————
提綱:
————————————
步驟一:初始化Log4J
步驟二:在Web模塊中應用Log4J
步驟三:測試
步驟四:在EJB應用中使用Log4J
步驟五:測試
步驟六:部署
————————————
Log4J是一個(gè)易用而強大的日志系統。本文將介紹如何在WebSphere應用中用最佳的方式配置和使用Log4J,我們將開(kāi)發(fā)一個(gè)J2EE 1.3應用,然后用WebSphere V5進(jìn)行測試。
步驟一:初始化Log4J
在J2EE應用中初始化Log4J有時(shí)是一個(gè)棘手的問(wèn)題。至少有兩種辦法可以初始化Log4J:
㈠ 調用PropertyConfigurator.configure(String propertyFileName)——該函數的參數是一個(gè)完整的路徑名稱(chēng),指向一個(gè)包含Log4J配置信息的屬性文件。J2EE應用程序不能對屬性文件所在的具體位置作任何假設——也就是說(shuō),使用該函數時(shí),J2EE應用程序應當知道屬性文件的確切位置。
㈡ 不調用PropertyConfigurator.configure(),而是讓Log4J自己在J2EE模塊的CLASSPATH中尋找一個(gè)叫Log4J.properties的屬性文件。查找屬性文件的操作在Logger.getLogger()函數第一次被調用時(shí)執行。在這篇文章中,我們將推薦使用這第二種方法。
下面是一個(gè)典型的log4j.properties屬性文件。
# 默認日志級別ERROR。其他可供選擇的級別包括INFO和DEBUGlog4j.rootLogger=ERROR, ROOTlog4j.appender.ROOT=org.apache.log4j.RollingFileAppenderlog4j.appender.ROOT.File=myapplication.loglog4j.appender.ROOT.MaxFileSize=1000KB# 保留5個(gè)舊的日志文件log4j.appender.ROOT.MaxBackupIndex=5log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout# 日志格式:按照WebSphere通用日志格式相似的方式記錄log4j.appender.ROOT.layout.ConversionPattern=[%d] %t %c %-5p - %m%n# 有選擇地更改某些包或者類(lèi)的日志級別log4j.logger.com.webage.ejbs=INFO
該配置文件展示了Log4J的如下功能:
⑴ 設置全局性的日志級別。ERROR級別將輸出用Logger.error()方法記錄的信息。INFO級別將輸出由Logger.error()和Logger.info()記錄的信息。最后,DEBUG級別將輸出包括Logger.debug()調用在內的所有日志信息。
⑵ “輪換”日志文件。在本例中,當日志文件(myapplication.log)達到1000KB時(shí),該文件就被關(guān)閉并備份,然后創(chuàng )建一個(gè)新的日志文件。
⑶ 設置日志文件的格式,包括時(shí)間、類(lèi)的名稱(chēng)和日志信息正文。
⑷ 針對某個(gè)Java包或類(lèi),有選擇地覆蓋全局的日志級別。在本例中,我們把com.webage.ejbs包的日志級別設置成了INFO。
步驟二:在Web模塊中應用Log4J
在這一部分,我們將學(xué)習如何在一個(gè)純Web模塊應用——即一個(gè)不包含EJB的應用中使用Log4J。
首先啟動(dòng)WSAD,創(chuàng )建一個(gè)J2EE 1.3企業(yè)應用項目,項目名稱(chēng)為L(cháng)ogTest,它包含一個(gè)Web模塊,名稱(chēng)為L(cháng)ogTestWeb。具體步驟如下:
㈠ 選擇菜單“文件”→“新建”→“項目”。在第一個(gè)對話(huà)框中選擇J2EE、企業(yè)應用程序項目。點(diǎn)擊“下一步”。
㈡ 在第二個(gè)對話(huà)框中,確認“創(chuàng )建J2EE 1.3‘企業(yè)應用程序’項目”,點(diǎn)擊“下一步”。
㈢ 如圖一,輸入企業(yè)應用程序項目名稱(chēng)LogTest,取消“EJB模塊”,在“Web模塊”的項目名稱(chēng)中輸入LogTestWeb。
㈣ 點(diǎn)擊“完成”。
圖一
在J2EE導航器中展開(kāi)LogTestWeb,找到Java Source文件夾,在該文件夾下面創(chuàng )建一個(gè)log4j.properties文件:右鍵點(diǎn)擊Java Source文件夾,選擇菜單“新建”→“其他”,接著(zhù)依次選擇“簡(jiǎn)單”、“文件”,點(diǎn)擊“下一步”,在“文件名”輸入框輸入文件名log4j.properties,點(diǎn)擊“完成”。按照本文前面的介紹,輸入log4j.properties屬性文件的內容,如圖二所示。當我們構造Web項目時(shí),這個(gè)屬性文件會(huì )被自動(dòng)復制到WEB-INF/classes文件夾。不要直接在WEB-INF/classes文件夾下面創(chuàng )建log4j.properties屬性文件,因為下一次重新構造Web項目時(shí),WSAD會(huì )刪除該目錄下的屬性文件。
圖二
從http://jakarta.apache.org/log4j/index.html下載Log4J發(fā)行版。解開(kāi)壓縮,將包文件(例如log4j-1.2.8.jar)復制到Web模塊的Web Content/WEB-INF/lib目錄,如圖三。
圖三
再次右擊Web模塊的Java Source文件夾,添加一個(gè)Java類(lèi)文件:右擊Java Source文件夾,選擇菜單“新建”→“類(lèi)”,輸入包的名稱(chēng)com.webage.model,輸入類(lèi)的名稱(chēng)MyModel,如圖四,點(diǎn)擊“完成”。
圖四
打開(kāi)MyModel.java文件,把它的內容改成:
package com.webage.model;import org.apache.log4j.Logger;public class MyModel {static Logger logger = Logger.getLogger(MyModel.class);;public void checkValid(String name, String value) throws Exception { logger.debug("ENTRY"); logger.debug("檢查參數: " + name); if (value == null) { throw new Exception("缺少參數。"); } if (value.trim().length() == 0) { throw new Exception("參數空。"); } logger.debug("EXIT");}}
進(jìn)階指南:在實(shí)際開(kāi)發(fā)中,作為Model的Java類(lèi)通常在單獨的Java項目中構造。如果這樣的話(huà),現在放入Web模塊的Log4J的JAR文件應當移到獨立Java項目的CLASSPATH之中,這樣才能讓Java類(lèi)順利通過(guò)編譯。運行時(shí),該Java項目的類(lèi)將由Web模塊的類(lèi)裝載器裝入,同時(shí)也將從WEB-INF/lib/log4j-1.2.8.jar文件裝入類(lèi)。如果你想要單獨運行該Java類(lèi)(例如通過(guò)JUnit運行),則你必須配置啟動(dòng)環(huán)境加入Log4J的JAR文件。
在J2EE導航器中,再次右擊Java Source文件夾,選擇菜單“新建”→“Servlet”,指定包的名稱(chēng)com.webage.servlets,指定Servlet的名稱(chēng)MyServlet,點(diǎn)擊“完成”。修改MyServlet,使它包含如下內容:
package com.webage.servlets;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import com.webage.model.MyModel;public class MyServlet extends HttpServlet { Logger logger = Logger.getLogger(MyServlet.class); public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.debug("ENTRY"); MyModel model = new MyModel(); resp.getWriter().println("<h1>Log4J測試</h1>"); try { model.checkValid("firstName", req.getParameter("firstName")); } catch (Exception e) { logger.error("doGet出現錯誤.", e); } logger.debug("EXIT"); } public void init() throws ServletException { super.init(); logger.info("Servlet初始化...");
步驟三:測試
將LogTest項目關(guān)聯(lián)到一個(gè)WebSphere V5服務(wù)器,運行MyServlet。默認情況下,由于我們沒(méi)有向Servlet提供參數,MyModel.checkValid方法將拋出一個(gè)異常,Servlet將在日志文件中記錄該異常。Log4J的全局日志級別設置成了ERROR,Log4J會(huì )把該日志條目加入到日志文件myapplication.log。默認日志文件myapplication.log位于WSAD的安裝根目錄下。
打開(kāi)log4j.properties文件,加入下面這行內容,將com.webage.model包的日志級別改成DEBUG。
log4j.logger.com.webage.model=DEBUG
為了讓修改生效,重新啟動(dòng)LogTest項目。再次運行Servlet,檢查日志文件的內容,這時(shí)日志文件應當顯示出MyModel類(lèi)的DEBUG級的日志信息。
如果你在WSAD的安裝根目錄下找不到日志文件myapplication.log,一種可能的原因是Log4J沒(méi)有能夠正常初始化。如果Log4J不能在CLASSPATH中找到log4j.properties文件,它將在標準輸出設備上輸出下列信息:
……..:WARN No appenders could be found for logger (com.webage.servlets.MyServlet). ……..:WARN Please initialize the log4j system properly.
如果你使用UNIX,請確保屬性文件名的拼寫(xiě)沒(méi)有錯誤(log4j.properties全部字母小寫(xiě))。另外,無(wú)論在哪種系統上,請確保文件路徑中的分隔符是UNIX風(fēng)格的分隔符,例如:
log4j.appender.ROOT.File=c:/temp/myapplication.log
步驟四:在EJB應用中使用Log4J
在LogTest企業(yè)應用模塊下新建一個(gè)EJB模塊,名字為L(cháng)ogTestEJB,具體步驟是:在J2EE導航器視圖中,右擊LogTest,選擇菜單“新建”→“項目”,再依次選擇“EJB”→“EJB項目”,點(diǎn)擊“下一步”。確認“創(chuàng )建2.0 EJB項目”。如圖五,輸入項目名稱(chēng)LogTestEJB,在“企業(yè)應用程序項目”中選擇“現有”,然后點(diǎn)擊“現有項目名”旁邊的“瀏覽”按鈕,選擇LogTest。點(diǎn)擊圖五中的“完成”按鈕。如果系統提示要修改服務(wù)器配置(加入子項目LogTestEJB),確認執行修改。
圖五
把Log4J的JAR文件從LogTestWeb模塊的WEB-INF/lib目錄移到LogTest項目的根目錄。右擊導航器中的LogTest,選擇菜單“新建”→“文件夾”,輸入文件夾名稱(chēng)lib,點(diǎn)擊“完成”按鈕。把log4j.properties文件從LogTestWeb項目拖到剛才創(chuàng )建的lib文件夾下。完成后的導航器內容如圖六所示。
圖六
定義LogTestEJB項目對Log4J JAR文件的相關(guān)性:右擊LogTestEJB,選擇“特性”,出現圖七對話(huà)框。選中“Java JAR相關(guān)性”,再選中Log4J的JAR文件(log4j-1.2.8.jar)。點(diǎn)擊“確定”按鈕。
圖七
按照類(lèi)似的操作步驟,定義LogTestWeb項目對Log4J JAR文件和LogTestEJB.jar的相關(guān)性(定義這些相關(guān)性之后,圖六中LogTestWeb項目圖標上的紅色“X”就會(huì )消失)。
將LogTest/lib目錄加入到服務(wù)器的CLASSPATH,操作步驟是:切換到“服務(wù)器”透視圖,在“服務(wù)器配置”視圖中雙擊服務(wù)器,點(diǎn)擊“路徑”選項卡,點(diǎn)擊“類(lèi)路徑”清單旁邊的“添加文件夾”,在“選擇文件夾”對話(huà)框中雙擊擴展LogTest,選中Lib,最后點(diǎn)擊“確定”。
步驟五:測試
在LogTestEJB項目中添加一個(gè)簡(jiǎn)單的會(huì )話(huà)EJB,名稱(chēng)為MySession。在MySessionBean.java中加入記錄日志的功能。在WSAD自動(dòng)生成的類(lèi)的基礎上進(jìn)行修改,如下所示:
import org.apache.log4j.Logger;public class MySessionBean implements javax.ejb.SessionBean { private javax.ejb.SessionContext mySessionCtx; Logger logger = Logger.getLogger(MySessionBean.class); //... public void aMethod() { logger.debug("ENTRY aMethod"); logger.debug("EXIT aMethod"); }}
為aMethod()定義遠程接口,然后在Servlet中加入調用EJB的代碼。再次運行Servlet,觀(guān)察日志文件的內容。
步驟六:部署
將應用從WSAD導出為一個(gè)EAR文件,然后將EAR安裝到WebSphere服務(wù)器。默認情況下,從EAR提取的內容將安裝到/installedApps/文件夾。從該文件夾把log4j.properties文件復制到/properties文件夾,該文件夾將被自動(dòng)加入到每一個(gè)應用服務(wù)器的CLASSPATH。
默認情況下,被配置為應用服務(wù)器的工作目錄。如果要在標準的/logs目錄下創(chuàng )建Log4J的日志文件,請打開(kāi)log4j.properties文件,按照如下方式修改日志文件的路徑和名稱(chēng):
log4j.appender.ROOT.File=logs/extranet.log
總結:在這篇文章中,我們探討了如何在純Web應用以及EJB、Web混合應用中使用Log4J。我們的目標是盡量地簡(jiǎn)化開(kāi)發(fā)和管理,這通過(guò)以下幾種途徑實(shí)現:
㈠ 我們沒(méi)有編寫(xiě)任何用來(lái)初始化Log4J的額外代碼。
㈡ 我們讓Log4J的JAR文件成為J2EE應用的一部分,因此不需要在應用的EAR文件之外單獨地發(fā)布和安裝Log4J的JAR文件。
㈢ 對于純Web應用來(lái)說(shuō),添加Log4J支持不涉及任何額外的管理工作,應用本身能夠找到WEB-INF/classes文件夾下面的log4j.properties文件。對于擁有EJB模塊的應用,我們必須配置應用服務(wù)器的CLASSPATH,使它能夠找到log4j.properties文件的位置。