|
理解类加载器:J2EE 环境下的 log4j |
作者:佚名 发布时间:2005-04-02 来源:不详
|
Log4j是一个很流行的 提供非常灵活的控制。它可 格式。而这一切都不需要改
|
日志记录工具。根据java项目不 以对输出信息进行分级控制。也 变源程序。
|
同的日志需求和调试需求。他可以 可以在运行时改变输出信息的表现
|
Log4j用三个对象来控 的layouts(样式)将日志 配置文件。(指定外部配置 载进来,也可能在运行的时
|
制日志的记录。Logger,append 记录到appenders中。在这个操 文件也是最好的一种方式)。这 候被改变。
|
ers,和layouts。logger会以特定 作过程中常常需要指定具体的外部 些配置信息会在你的应用开始时加
|
| • 指定root logger的级别并且和一个appender绑定 |
2.在你的代码中,需要
|
根据class或name得到一个logge
|
r.典型的一种做法是将logger
|
3.用你从第二步得到的logger的任
|
何一种方法(log.debug(),log.info(),log.warn
|
在这本书的例子是运行在weblogic 7 产品(如jboss)是因为weblogic为在项 的应用服务器。自从我发表的之前的文章 是暗示推荐使用weblogic。这只是提供一
|
.0 sp2 demo上。我们之所以用weblogic代替开源的 目组中配置log4j提出了更多的挑战。它也是最流行 。我收的绝大多数问题都是关于它的。但是这里决不 个测试环境。说明在j2ee环境下如何配置log4j
|
Weblogic7.0sp2可以从 必须要在bea上面进行一些 有别的选择。你可以选择免
|
BEA's trial page下载。选择你 个人信息的注册。而且下载的文 费的测试CD
|
需要的版本类型进行下载。注意你 件很巨大。大约有150M。当然你也
|
如果你得到了安装文件。安装就很简 。我们的测试环境选择典型安装。当安装 yes然后就会运行Domain的配置向导。第 为Domain的类型,给它起个名字叫mydoma server(standalone server).再下一屏选 进行配置。然后一路next就可以了。最后 以admin作为管理员帐号,password最为 注册成windows的services(在windows环 始菜单上方置快捷方式。最后点击create
|
单了。你只需要按照安装向导一步一步安装就可以了 到最后,安装向导会问你是否需要配置Domain.选择 一屏、选择Domain的类型和名字。选择WLSDomain作 in.第二屏、设置server的类型为单一 择缺省路径做为Domain的路径,再点击next为server 需要你为domain输入管理员帐号和密码。我一般就是 密码(很原始的做法)。接下来选择是否将service 境下安装),一般选择no。最后选择yes在windows开 建立Domain.
|
| 运行weblogic就很简单了。从开始菜单Start->All Programs->BEA WebLogic Platform 7.0->User Projects->mydomain->Start Server这样可以启动server.不过更常用的方式是从dos命令行,进入BEA的HOME目录。进入user_projectsmydomain后,运行startWebLogic.cmd.就可以了。启动的时候会要求你输入管理员帐号和密码。最后你可以看到server开始启动。当你看到Server start in running mode表示启动成功。如果要关闭你只要关闭Dos窗口就可以了。 |
如果你安装运行成功。 你会进入webogic的管理界 管理员帐号和密码。就和启 以执行相应的管理任务。
|
你可以在浏览器中输入如下地址 面。你可以对applications和se 动时输入的一样。进入后你可以
|
http://localhost:7001/console. rver进行各种配置。当然你要输入 看到各种管理任务的界面。你也可
|
和前面提到的一样。Lo 和安装log4j的二进制代码
|
g4j可以从log4j web site.下载 。在这章最后我们会介绍log4j
|
。请按照前面的文章介绍进行下载 的配置。
|
虽然有关类加载器的讨 如何影响应用服务器中log4
|
论在本文以外已经有很多了。但 j的配置的。
|
是我还是尽力解释一下类加载器是
|
类加载器。顾名思义,表示在java虚 前。它必须通过类加载器加载使之有效。 加载到java虚拟机。但是类加载器本事就 载器呢。
|
拟机中加载calsses.在我们的class执行和被访问之 给定一个class名字,类加载器会定位class并且将它 是class。这就带来一个问题。是谁来加载这些类加
|
当你运行一个java程序。(例如在命 地的native java launcher(我叫他java 是指针对你的平台和运行环境而言。这个 的名字叫做bootstrap 类加载器.(引导类 关。而且它不是用java写成的。这个引导
|
令行内输入java命令),它就会执行并且启动一个本 启动者,估计不太准确注明一下)。这里本地的意思 本地的java启动者包含一个类加载器,这个类加载器 加载器).这个引导类加载器.是本地的和你的环境有 类加载器的主要功能是加载java的核心类。
|
Java虚拟机缺省会执行 器和application(应用)类 导类加载器会加载java的核 java核心类(例如:javax. 用类加载器会加载你应用下
|
其他两个类加载器.引导类加载 加载器到内存中。这些都是用ja 心类(例如:java.util包下的 包下的类,或者是在运行环境中 的各种class文件。
|
器会加载extension(扩展)类加载 va写成的。和前面提到的一样。引 类)。扩展类加载器会加载扩展的 类路径ext目录下的java类。)应
|
所有三种类加载器都遵 务委托给父一级类加载器. 扩展类加载器.而扩展类加 个核心类。那么引导类加载 。这个请求就会返回到扩展 载器会先让它的父一级的类 子一级的类加载器为它自己
|
循委托模式。当低一级的类加载 当你的应用需要一个特殊的类。 载器又会将这个任务委托个引导 器会将这个类加载,使你可以使 类加载器.最后在返回到应用类 加载器搜索需要的类。只有当父 搜索所需的类。
|
器需要定位一个类。它会将这个任 应用类加载器会将这个任务委托给 类加载器.。如果你请求的类是一 用这个类。但是如果找不到这个类 加载器.这样的做法就使每个类加 一级的类加载器没有找到。才会让
|
在应用服务器当中,每一个独立部署 情况下,这也是weblogic的处理方式)。 载特定的ejb和web应用。(注意一点,当 合,这时候只会有一个类加载器,不会再 有webapp和ejb所需要的类包。当然首先 。它可以加载也可以卸载类包。但它有一 应用进行热部署。
|
的web应用和EJB都会取得属于自己的类加载器(正常 这种类加载器来源于应用类加载器.它们主要用来加 我们的web应用打包成ear文件――ejb和webapps的混 分成ejb和webapp两种)这种新的类加载器会加载所 这些类包不存在于java核心类中和扩展类中(ext) 种缺省类加载器所没有的特性。这个特性就是可以对
|
当weblogic启动的时候 运行环境。然后它会启动特 .java的应用类加载器会为 的应用的类加载器是不可见 。
|
。它会用java提供的应用类加载 定的类加载器.这种特定的类加 特定的类加载器加载相应的clas 。因此。一个特定应用所加载的
|
器加载相应的类。并且构造相应的 载器来源于java的应用类加载器 ses.这种特定的类加载器对于其他 classes.对于其他应用是不可见的
|
那么我们如何使一个单 把这个类方在weblogic中cl 器会自动把类加载到内存中 点也很明显。首先你失去了 任何变化意味着server必须 些类。所以当你采用这种方
|
独的类对所有的应用都起作用呢 asspath里面。当weblogic启动 去。所有的子应用都是可以访问 在所有特定应用中对指定类进行 从新启动。因为没有一种机制可 法的时候你要权衡一下得失。
|
。只有使用上层的类加载器.可以 的时候。缺省的java 应用类加载 到这个类的。但是。这中方法的缺 热部署的能力。第二、这些类发生 以让java应用类加载器从新加载这
|
对你的j2ee应用来说,Log4j是一种 前面提到一种建议是。将它放到weblogic 。不太建议使用这种方法。但是在j2ee环 加载的classes而有一些自己的特点(ejb 使用的相同类加载器加载ejb和webapp.下
|
扩展类库。那么我们应该把这个类库放到那里去呢。 启动时的classpath中。但是前面也讲到了它的缺点 境下配置log4j会因为ejb无法得知由webapp类加载器 和webapp用的类加载器不相同)。除非你的包和应用 面我为说明这一点举个例子。
|
我们会在我们安装的we 常简单的ejb。当它被调用
|
blogic中部署一个非常简单的应 的时候会返回”hello world”
|
用它包括jsp和ejb.这个ejb是个非
|
| Example: Why Doesn't It Work? |
让我们用weblogic 的控制台安装.wa 们想要安装ejb的.jar文件的时候。我们
|
r文件和。Ejb的.jar(EJB .jar file)文件。当我 会发现org.apache.log4j.logger找不到的错误。
|
Ejb的.jar文件无法从 为ejb和webapp使用的是不 .ear file)。我们还是得 中使用相同的类加载器。我
|
与它相对应的webapp的目录下的 的类加载器.甚至是我们将ejb和 到错误信息。这是为什么?即使 们还没有告诉我们的ejb去那里
|
web-inf目录得到log4j的消息。因 webapp打包到同一个ear文件中( 我们将ejb和webapp打包到ear文件 访问log4j.jar文件。
|
| Example: Why It Will Work |
这里有个升级后可以工
|
作的ear文件(updated .ear fi
|
le)让我们看看都做了那些改动。
|
• 我将log4j.jar文件从webap ejb.jar文件平级。这
|
p的lib目录下面一移到了外层目录。与.war和
|
• 我更改的Ejb log4j.jar的classpath
|
.jar文件中的Manifest.mf,增
|
加一个条目,使他包含了指向
|
这些更改已经可以使我们将这个应用 没有出错信息了。因为现在ejb可以访问l 器.它为整个应用加载类库和classes。在 决对log4j.jar文件的依赖和加载。Webap 录的外边。因为他们用的是同一个类加载
|
部署到weblogic上。当我们用控制台部署的时候已经 og4j。对于loa4jDemoEar2这个应用只有一个类加载 EJB中的.mf文件中添加的classpath条目主要用来解 p也可以访问到log4j.jar.即使我们将它移到了lib目 器。
|
根据你的需求。我建议如下策略。你 署扩展的classes的应用。
|
会发现这不仅仅与log4j相关。而适用于所有需要部
|
• 如果你的clas web-info/lib这个目录。
|
ses仅仅被你的webapplication
|
使用。那么把它部署到
|
• 如果你的web 的classpath条目。指明需 、ejb.jar放在同一层次。 署。
|
应用和ejb都需要这个classes。 要的classes。并且将classes放 这样你的ejb和webapp都可以访
|
那么在你的ejb的.mf文件增加相应 到ear文件中的最上一层。和.war 问这个classes而不需要反复的部
|
如果你不清出类加载器的工作方式。 子下面“机制。对成功部署j2ee应用非常 classes.
|
J2ee的打包工作就会变的非常繁琐。清楚的了解“帽 重要。它会帮助部署工程师明确自己如何连接这些
|
| Log4j在j2ee环境下的工作没有什么不同。只是需要能够进行正确的配置。 |
|
| |
|
|
|