Конфигурация log4j, специфичная для среды, по spring - программирование
Подтвердить что ты не робот

Конфигурация log4j, специфичная для среды, по spring

Я загружаю log4j.xml традиционным способом

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Это прекрасно работает, но теперь мне нужно загрузить другой файл log4j.xml на основе того, в какой среде я нахожусь, в которой определяется переменная среды /jndi. Поэтому я надеялся, что с новым управлением свойствами spring 3.1 Я мог бы просто изменить это на

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j-${ENV-NAME}.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

и spring загрузит правильный файл log4j в каждую среду, но это не работает, вероятно, потому что web.xml загружен до spring. Я наткнулся на этот метод

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
 <list>
  <value>log4j-${ENV-NAME}.xml</value>
 </list>
</property>
</bean>

так что существенно перемещая конфигурацию log4j в контекстный файл spring вместо web.xml. Но это не работает либо по какой-то причине, что регистрация включается таким образом, что все регистрируется. Итак, как я могу использовать другой файл log4j.xml на основе переменной окружения или программно загружать его в servletcontextlistener.

4b9b3361

Ответ 1

Это слишком поздно, чтобы помочь adeelmahmood, но надеюсь, что другие получат мой ответ. Дело в том, что adeelmahmood был прав, эта конфигурация:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j-${ENV-NAME}.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

работает, но:

  • Log4jConfigListener должен быть зарегистрирован до ContextLoaderListener в web.xml!!!
  • Вы также должны помнить, что Log4jConfigListener предполагает расширенный WAR файл.

Затем, если задана переменная среды ENV-NAME, она работает как ожидалось.

Кстати, ${ENV-NAME} можно использовать и в конфигурационных файлах spring! Это не все... Вы также можете использовать наш env.property для установки профиля spring:

<context-param>
 <param-name>spring.profiles.active</param-name>
 <param-value>${ENV-NAME}</param-value>
</context-param>

Таким образом вы можете установить log4jConfigLocation и spring профиль, как с одним, так и с env. переменная.

BTW и на всякий случай: используя профили Maven, чтобы иметь отдельные сборки для разработчиков, тестирование и производство не являются хорошей практикой. Прочтите, например. http://java.dzone.com/articles/maven-profile-best-practices и помните: "Использовать профили для управления переменными времени сборки, а не переменными времени выполнения, а не (с исключениями RARE) альтернативными версиями ваш артефакт".

Ответ 2

Это полезно, но возможно ли сделать что-то вроде:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>${ENV_HOME}conf/log4j.xml</param-value>
</context-param>

Где ENV_HOME добавляется как -DENV_HOME=file:///C:/my_env/?

Я пробовал это, но это приводит к тому, что сначала выполняется предварительный просмотр каталога взорванных веб-приложений. Например.

log4j:ERROR Could not parse url [file:/C:/<path-to-tomcat>/webapps/<exploded-war-path>/file:/C:/my_env/conf/log4j.xml].

Ответ 3

Это может также помочь более поздним читателям: в Log4j 2.7 (но, вероятно, старше) имя параметра было изменено: см. интерфейс Log4jWebSupport:

/**
 * The {@link javax.servlet.ServletContext} parameter name for the location of the configuration.
 */
String LOG4J_CONFIG_LOCATION = "log4jConfiguration";