使用log4j进行多个应用程序的应用程序级别日志无法在weblogic上运行

时间:2011-12-01 12:26:22

标签: tomcat log4j weblogic

我使用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>

1 个答案:

答案 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应用程序可能会获得它自己的类版本。