分享

使用Log4J一二三

 duduwolf 2005-08-15

————————————

提纲:

————————————

步骤一:初始化Log4J

步骤二:在Web模块中应用Log4J

步骤三:测试

步骤四:在EJB应用中使用Log4J

步骤五:测试

步骤六:部署

————————————

Log4J是一个易用而强大的日志系统。本文将介绍如何在WebSphere应用中用最佳的方式配置和使用Log4J,我们将开发一个J2EE 1.3应用,然后用WebSphere V5进行测试。

步骤一:初始化Log4J

在J2EE应用中初始化Log4J有时是一个棘手的问题。至少有两种办法可以初始化Log4J:

㈠ 调用PropertyConfigurator.configure(String propertyFileName)——该函数的参数是一个完整的路径名称,指向一个包含Log4J配置信息的属性文件。J2EE应用程序不能对属性文件所在的具体位置作任何假设——也就是说,使用该函数时,J2EE应用程序应当知道属性文件的确切位置。

㈡ 不调用PropertyConfigurator.configure(),而是让Log4J自己在J2EE模块的CLASSPATH中寻找一个叫Log4J.properties的属性文件。查找属性文件的操作在Logger.getLogger()函数第一次被调用时执行。在这篇文章中,我们将推荐使用这第二种方法。

下面是一个典型的log4j.properties属性文件。

# 默认日志级别ERROR。其他可供选择的级别包括INFO和DEBUG
log4j.rootLogger=ERROR, ROOT
log4j.appender.ROOT=org.apache.log4j.RollingFileAppender
log4j.appender.ROOT.File=myapplication.log
log4j.appender.ROOT.MaxFileSize=1000KB
# 保留5个旧的日志文件
log4j.appender.ROOT.MaxBackupIndex=5
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
# 日志格式:按照WebSphere通用日志格式相似的方式记录
log4j.appender.ROOT.layout.ConversionPattern=[%d] %t %c %-5p - %m%n
# 有选择地更改某些包或者类的日志级别
log4j.logger.com.webage.ejbs=INFO



该配置文件展示了Log4J的如下功能:

⑴ 设置全局性的日志级别。ERROR级别将输出用Logger.error()方法记录的信息。INFO级别将输出由Logger.error()和Logger.info()记录的信息。最后,DEBUG级别将输出包括Logger.debug()调用在内的所有日志信息。

⑵ “轮换”日志文件。在本例中,当日志文件(myapplication.log)达到1000KB时,该文件就被关闭并备份,然后创建一个新的日志文件。

⑶ 设置日志文件的格式,包括时间、类的名称和日志信息正文。

⑷ 针对某个Java包或类,有选择地覆盖全局的日志级别。在本例中,我们把com.webage.ejbs包的日志级别设置成了INFO。

步骤二:在Web模块中应用Log4J

在这一部分,我们将学习如何在一个纯Web模块应用——即一个不包含EJB的应用中使用Log4J。

首先启动WSAD,创建一个J2EE 1.3企业应用项目,项目名称为LogTest,它包含一个Web模块,名称为LogTestWeb。具体步骤如下:

㈠ 选择菜单“文件”→“新建”→“项目”。在第一个对话框中选择J2EE、企业应用程序项目。点击“下一步”。

㈡ 在第二个对话框中,确认“创建J2EE 1.3‘企业应用程序’项目”,点击“下一步”。

㈢ 如图一,输入企业应用程序项目名称LogTest,取消“EJB模块”,在“Web模块”的项目名称中输入LogTestWeb。

㈣ 点击“完成”。



图一



在J2EE导航器中展开LogTestWeb,找到Java Source文件夹,在该文件夹下面创建一个log4j.properties文件:右键点击Java Source文件夹,选择菜单“新建”→“其他”,接着依次选择“简单”、“文件”,点击“下一步”,在“文件名”输入框输入文件名log4j.properties,点击“完成”。按照本文前面的介绍,输入log4j.properties属性文件的内容,如图二所示。当我们构造Web项目时,这个属性文件会被自动复制到WEB-INF/classes文件夹。不要直接在WEB-INF/classes文件夹下面创建log4j.properties属性文件,因为下一次重新构造Web项目时,WSAD会删除该目录下的属性文件。



图二



从http://jakarta./log4j/index.html下载Log4J发行版。解开压缩,将包文件(例如log4j-1.2.8.jar)复制到Web模块的Web Content/WEB-INF/lib目录,如图三。



图三



再次右击Web模块的Java Source文件夹,添加一个Java类文件:右击Java Source文件夹,选择菜单“新建”→“类”,输入包的名称com.webage.model,输入类的名称MyModel,如图四,点击“完成”。



图四



打开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");
}
}


进阶指南:在实际开发中,作为Model的Java类通常在单独的Java项目中构造。如果这样的话,现在放入Web模块的Log4J的JAR文件应当移到独立Java项目的CLASSPATH之中,这样才能让Java类顺利通过编译。运行时,该Java项目的类将由Web模块的类装载器装入,同时也将从WEB-INF/lib/log4j-1.2.8.jar文件装入类。如果你想要单独运行该Java类(例如通过JUnit运行),则你必须配置启动环境加入Log4J的JAR文件。

在J2EE导航器中,再次右击Java Source文件夹,选择菜单“新建”→“Servlet”,指定包的名称com.webage.servlets,指定Servlet的名称MyServlet,点击“完成”。修改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项目关联到一个WebSphere V5服务器,运行MyServlet。默认情况下,由于我们没有向Servlet提供参数,MyModel.checkValid方法将抛出一个异常,Servlet将在日志文件中记录该异常。Log4J的全局日志级别设置成了ERROR,Log4J会把该日志条目加入到日志文件myapplication.log。默认日志文件myapplication.log位于WSAD的安装根目录下。

打开log4j.properties文件,加入下面这行内容,将com.webage.model包的日志级别改成DEBUG。

log4j.logger.com.webage.model=DEBUG

为了让修改生效,重新启动LogTest项目。再次运行Servlet,检查日志文件的内容,这时日志文件应当显示出MyModel类的DEBUG级的日志信息。

如果你在WSAD的安装根目录下找不到日志文件myapplication.log,一种可能的原因是Log4J没有能够正常初始化。如果Log4J不能在CLASSPATH中找到log4j.properties文件,它将在标准输出设备上输出下列信息:

……..:
WARN No appenders could be found for logger (com.webage.servlets.MyServlet). 
……..:
WARN Please initialize the log4j system properly.


如果你使用UNIX,请确保属性文件名的拼写没有错误(log4j.properties全部字母小写)。另外,无论在哪种系统上,请确保文件路径中的分隔符是UNIX风格的分隔符,例如:

log4j.appender.ROOT.File=c:/temp/myapplication.log

步骤四:在EJB应用中使用Log4J

在LogTest企业应用模块下新建一个EJB模块,名字为LogTestEJB,具体步骤是:在J2EE导航器视图中,右击LogTest,选择菜单“新建”→“项目”,再依次选择“EJB”→“EJB项目”,点击“下一步”。确认“创建2.0 EJB项目”。如图五,输入项目名称LogTestEJB,在“企业应用程序项目”中选择“现有”,然后点击“现有项目名”旁边的“浏览”按钮,选择LogTest。点击图五中的“完成”按钮。如果系统提示要修改服务器配置(加入子项目LogTestEJB),确认执行修改。



图五



把Log4J的JAR文件从LogTestWeb模块的WEB-INF/lib目录移到LogTest项目的根目录。右击导航器中的LogTest,选择菜单“新建”→“文件夹”,输入文件夹名称lib,点击“完成”按钮。把log4j.properties文件从LogTestWeb项目拖到刚才创建的lib文件夹下。完成后的导航器内容如图六所示。



图六



定义LogTestEJB项目对Log4J JAR文件的相关性:右击LogTestEJB,选择“特性”,出现图七对话框。选中“Java JAR相关性”,再选中Log4J的JAR文件(log4j-1.2.8.jar)。点击“确定”按钮。



图七



按照类似的操作步骤,定义LogTestWeb项目对Log4J JAR文件和LogTestEJB.jar的相关性(定义这些相关性之后,图六中LogTestWeb项目图标上的红色“X”就会消失)。

将LogTest/lib目录加入到服务器的CLASSPATH,操作步骤是:切换到“服务器”透视图,在“服务器配置”视图中双击服务器,点击“路径”选项卡,点击“类路径”清单旁边的“添加文件夹”,在“选择文件夹”对话框中双击扩展LogTest,选中Lib,最后点击“确定”。

步骤五:测试

在LogTestEJB项目中添加一个简单的会话EJB,名称为MySession。在MySessionBean.java中加入记录日志的功能。在WSAD自动生成的类的基础上进行修改,如下所示:

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,观察日志文件的内容。

步骤六:部署

将应用从WSAD导出为一个EAR文件,然后将EAR安装到WebSphere服务器。默认情况下,从EAR提取的内容将安装到/installedApps/文件夹。从该文件夹把log4j.properties文件复制到/properties文件夹,该文件夹将被自动加入到每一个应用服务器的CLASSPATH。

默认情况下,被配置为应用服务器的工作目录。如果要在标准的/logs目录下创建Log4J的日志文件,请打开log4j.properties文件,按照如下方式修改日志文件的路径和名称:

log4j.appender.ROOT.File=logs/extranet.log

总结:在这篇文章中,我们探讨了如何在纯Web应用以及EJB、Web混合应用中使用Log4J。我们的目标是尽量地简化开发和管理,这通过以下几种途径实现:

㈠ 我们没有编写任何用来初始化Log4J的额外代码。

㈡ 我们让Log4J的JAR文件成为J2EE应用的一部分,因此不需要在应用的EAR文件之外单独地发布和安装Log4J的JAR文件。

㈢ 对于纯Web应用来说,添加Log4J支持不涉及任何额外的管理工作,应用本身能够找到WEB-INF/classes文件夹下面的log4j.properties文件。对于拥有EJB模块的应用,我们必须配置应用服务器的CLASSPATH,使它能够找到log4j.properties文件的位置。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多