如何用另一个 log4j2 配置文件覆盖 log4j2 配置文件?

问题描述 投票:4回答:3

我当前的 Web 应用程序使用 log4j 1.2,我想迁移到 log4j2,但我一直不知道如何处理我的特殊用例。

在我的web应用的war文件中,我存储了一个log4j配置文件,它有合理的默认值。 我的设计是在 war 文件之外搜索一个配置文件,它将覆盖与 war 捆绑的配置。 这样在部署的时候就可以配置日志配置,而且每个服务器的配置可以不同。

使用log4j 1.2,通过ServletContextListener用下面的方法来实现,效果很好。

/**
 * Configures system-wide log4j logging system with log4j.xml from the
 * class path.  This overrides configuration from the default location in
 * Tomcat:  WEB-INF/classes
 */
private void configureLog4J() {
    URL url = ClassLoader.getSystemResource("log4j.xml");
    if (url != null) {
        DOMConfigurator.configure(url);
        log = org.apache.log4j.LogManager.getLogger(LDSContextListener.class);
        log.info("log4j.xml loaded from " + url);
    }
}

如果我要迁移到log4j2,我怎么能用外部文件的配置来覆盖内部文件?DOMConfigurator 的API。

log4j log4j2
3个回答
3
投票

我找到了一个解决方案,它并不完全复制我之前的做法,但足够接近。

我没有对log4j进行编程配置,而是在其中添加了以下内容 log4j-web-2.0.jar 到我的classpath中,并将以下内容添加到我的web.xml中。

<context-param>
  <param-name>isLog4jAutoInitializationDisabled</param-name>
  <param-value>true</param-value>
</context-param>
<context-param>
  <param-name>log4jConfiguration</param-name>
  <param-value>file:///usr/jboss/ldsconf/log4j2.xml</param-value>
</context-param>

<listener>
  <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>

<filter>
  <filter-name>log4jServletFilter</filter-name>
  <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>log4jServletFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>INCLUDE</dispatcher>
  <dispatcher>ERROR</dispatcher>
  <dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
</filter-mapping>

其中log4jConfiguration context-param 指定了我的外部配置文件的位置,这与ClassLoader在classpath中搜索配置文件是不一样的。 这与ClassLoader在classpath中搜索配置文件的做法不同,但它仍然允许我引用外部配置文件。 另外,如果这个文件不存在,系统会回落到内部配置文件,这正是我想要的。

引用。 http:/logging.apache.orglog4j2.xmanualwebapp.html。


0
投票

我建议你在Log4j2 Jira问题跟踪器上创建一个功能请求。


0
投票

你可以在启动应用程序时添加一个名为LOG4J_CONFIGURATION_FILE的环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.