others - 如何使用其他log4j2配置文件覆盖log4j2配置文件?

  显示原文与译文双语对照的内容

我当前的web应用程序使用 Log4J 1.2,但我想迁移到 log4j2,但是我还没有找到如何处理我的用例。

在我的app文件中,我存储了一个 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-web-2.0.jar 添加到我的web.xml,而不是以编程方式配置 Log4J,并将以下内容添加到我的中:


<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 指定我的外部配置文件的位置。 这与加载类文件搜索配置文件的类路径不同,但是它仍然允许我引用外部配置文件。 另外,如果该文件不存在,系统将返回到内部配置文件,这正是我所希望的。

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

原作者:

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

原作者:
...