我使用weblogic在服务器上部署了两个应用程序。我为每个应用程序创建了单独的属性文件和配置servlet。但是出现的问题是记录器附加到最新部署的应用程序的日志文件中。代码在tomcat上工作正常,但是当部署在weblogic服务器上时,它的行为就像只有一个实例正在运行,而且也是最新的实例。
我在WEB-INF中输入的log4j.properties文件:
log4j.rootLogger=INFO, R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=C:abc.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.Append=true
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %-5p %c (%F:%L) - %m%n
我已将 log4j-1.2.14.jar放在lib文件夹中,所有库都驻留在这里。
在servlet init()方法中启动它:
public void init() throws ServletException {
logger.info("Servlet...................");
super.init();
String prefix = getServletContext().getRealPath("/");
String log4j = getServletContext().getInitParameter"log4jConfig");
if (log4j != null) {
PropertyConfigurator.configure(prefix + log4j);
}
}
和web.xml条目是:
<context-param>
<param-name>log4jConfig</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
答案 0 :(得分:1)
您应该了解类加载器的结构:
Bootstrap
|
System
|
Common
/ \
Webapp1 Webapp2
以下是类加载器的层次结构:
如果您将log4j.jar放到Common classloader,例如,将Tomcat放入$ CATALINA_BASE / lib,则所有Web应用程序将共享同一个类,并且您将只能为所有Web应用程序配置一个log4j配置。
解决问题的最简单方法是将log4j.jar的单独副本放入WEB-INF / lib文件夹,将log4j.properties文件放入Web应用程序的WEB-INF / classes文件夹中。请注意,在这种情况下,您根本不需要任何log4j初始化。 Here是有关Tomcat的log4j配置的文档。
已更新 正如Weblogic中所述,类加载模型与Tomcat略有不同:
weblogic.xml Web应用程序部署描述符包含一个 &lt; prefer-web-inf-classes&gt; 元素(该元素的子元素) &lt; container-descriptor&gt; 元素)。默认情况下,此元素设置为 的假即可。将此元素设置为True会颠覆类加载器 委托模型使类定义来自Web应用程序 优先加载到更高级别的类定义 类加载器。这允许Web应用程序使用自己的版本 第三方类,也可能是WebLogic Server的一部分。
请尝试在Weblogic中将&lt; prefer-web-inf-classes&gt; 设置为true。之后,每个Web应用程序可能会获得它自己的类版本。