【问题标题】:How do you override a log4j2 configuration file with another log4j2 configuration file?如何用另一个 log4j2 配置文件覆盖 log4j2 配置文件?
【发布时间】:2014-10-07 07:28:44
【问题描述】:

我当前的 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,如何使用来自外部文件的配置覆盖内部文件? log4j2 的 API 中没有 DOMConfigurator

【问题讨论】:

    标签: log4j log4j2


    【解决方案1】:

    我找到了一个解决方案,它不能完全复制我以前的解决方案,但已经足够接近了。

    我没有以编程方式配置 log4j,而是将 log4j-web-2.0.jar 添加到我的类路径并将以下内容添加到我的 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 在类路径中搜索配置文件不同,但它仍然允许我引用外部配置文件。此外,如果此文件不存在,系统将回退到内部配置文件,这正是我想要的。

    参考:http://logging.apache.org/log4j/2.x/manual/webapp.html

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2014-10-18
          • 2019-09-30
          • 1970-01-01
          • 2018-05-06
          • 1970-01-01
          • 1970-01-01
          • 2014-06-05
          • 2022-01-20
          • 2016-10-24
          相关资源
          最近更新 更多