【问题标题】:Application-level logs using log4j for multiple application is not working on weblogic对多个应用程序使用 log4j 的应用程序级日志在 weblogic 上不起作用
【发布时间】:2011-12-01 12:26:22
【问题描述】:

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

【问题讨论】:

  • 我至少可以看到 2 个错别字。属性文件中的File=C:abc.log 缺少斜杠,代码中的getServletContext().getInitParameter"log4jConfig") 缺少(

标签: tomcat log4j weblogic


【解决方案1】:

你应该了解类加载器的结构:

        Bootstrap
            |
         System
            |
         Common
         /     \
     Webapp1   Webapp2

这里解释了类加载器的层次结构:

如果您将 log4j.jar 放入 Common 类加载器,例如,对于 Tomcat,放入 $CATALINA_BASE/lib,所有 Web 应用程序将共享同一个类,并且您将能够为所有 Web 应用程序仅使用一个 log4j 配置.

解决问题的最简单方法是将 log4j.jar 的单独副本放入 Web 应用程序的 WEB-INF/lib 文件夹,并将 log4j.properties 文件放入 Web 应用程序的 WEB-INF/classes 文件夹。请注意,在这种情况下,您根本不需要任何 log4j 初始化。 Here 是 Tomcat 的 log4j 配置文档。

更新 正如Weblogic 中所说,类加载模型与Tomcat 略有不同:

weblogic.xml Web 应用程序部署描述符包含一个 元素( 元素)。默认情况下,此元素设置为 错误。将此元素设置为 True 会破坏类加载器 委托模型,以便来自 Web 应用程序的类定义 优先于更高级别的类定义加载 类加载器。这允许 Web 应用程序使用它自己的版本 第三方类,它也可能是 WebLogic Server 的一部分。

请尝试在 Weblogic 中将 设置为 true。之后,每个 Web 应用程序都可能会获得自己的类版本。

【讨论】:

  • 您好 Nulldevice,感谢您的宝贵回答,但正如您所说,我已经将 log4j.jar 的单独副本放入 lib 文件夹和 classes 文件夹中的属性文件,但它仅将文件附加到一个应用程序的记录哪个是最新部署的。
  • 尽管如此,我坚持类加载器层次结构问题:) 请查看我的更新以回答并请检查prefer-web-inf-classes 元素的值,因为它默认为“false”,而不是适合您的需求。
  • 我在 weblogic.xml 中将设置从 false 更改为 true,但它的行为仍然相同.... :(
  • @coolone 你应该把你的 log4j.properties 放在 WEB-INF/classes 中,去掉 init() 方法,让 Log4j 自己初始化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2020-02-01
  • 2018-01-04
  • 2019-03-22
  • 2012-12-29
相关资源
最近更新 更多