Как заменить файл конфигурации log4j2 другим файлом конфигурации log4j2?

В моем текущем веб-приложении используется log4j 1.2, и я хотел бы перейти на log4j2, но я не смог понять, как справиться с моим конкретным вариантом использования.

В файле war моего веб-приложения я храню файл конфигурации log4j, который имеет разумные значения по умолчанию. Моя цель - поиск файла конфигурации, внешнего по отношению к файлу войны, который переопределил бы конфигурацию, связанную с войной. Таким образом, конфигурация ведения журнала настраивается во время развертывания и может быть разной для каждого сервера.

Используя 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 не имеет DOMConfigurator в своем API.


person dhalsim2    schedule 13.08.2014    source источник


Ответы (3)


Я нашел решение, которое не совсем повторяет то, что было у меня раньше, но достаточно близко.

Вместо программной настройки 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

person dhalsim2    schedule 19.08.2014

Я предлагаю вам создать запрос функции в системе отслеживания проблем Log4j2 Jira.

person Remko Popma    schedule 14.08.2014

Вы можете добавить переменную среды под названием LOG4J_CONFIGURATION_FILE при запуске приложения.

person Dragos Ionut    schedule 04.05.2020