Как определить переменные в spring xmls для использования в log4j.properties

Вид головоломки здесь.

У меня есть приложение в WAR. Там есть web.xml и application context.xml, а также есть log4j.properties. Эта WAR работает в tomcat.

Существует возможность использовать некоторые переменные в log4j.properties, например. log4j.appender.file.File=${catalina.base}/logs/app.log

Я хочу определить переменную в web.xml или context.xml и использовать ее в log4j.properties. Например, как-то установите version=1.1 и используйте log4j.appender.file.File=${catalina.base}/logs/app-${version}.log. Это не должно быть переменной среды.

Могу ли я это сделать без перекомпиляции приложения?

ADD не должен ничего влиять, но на всякий случай...

Его web.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee">

<!-- Spring -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:context.xml</param-value>
</context-param>

<!-- log4j -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>10000</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
...
</web-app>

Ответы

Ответ 1

Создайте подкласс org.springframework.web.util.Log4jConfigListener, который выставляет значение version как Системную переменную (и, конечно же, вы можете передать значение через стандартную переменную среды System/Java).

public class TestListener extends Log4jConfigListener{

    @Override
    public void contextInitialized(ServletContextEvent pEvent) {
        String value = pEvent.getServletContext().getInitParameter("version");
        String version = System.getProperty("version");
        if (version == null || version.trim().length()==0) System.setProperty("version", value);

        super.contextInitialized(pEvent);
    }
}

И исправьте web.xml

 <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee">

    <!-- Spring -->
    ...
    <!-- log4j -->
    <listener>
        <listener-class>com.TestListener</listener-class>
    </listener>
    <context-param>
        <param-name>version</param-name>
        <param-value>1.1</param-value>
    </context-param>
    ...

Ответ 2

Я думаю, вы можете сделать это, объявив context-param в web.xml и используя это имя параметра в файле свойств, который вы хотите поместить в версию или что-то еще.

в web.xml

<context-param>
    <param-name>version</param-name>
    <param-value>1.1</param-value>
</context-param>

в файле свойств

log4j.appender.file.File=${version}/logs/app.log

Это должно работать с перезагрузкой сервера, не требуется компиляция.

Вы также можете попробовать установить свойство из xml и получить доступ к ti из файла свойств.

в web.xml

<Properties>
    <Property name="version">1.1</Property>
</properties>

в файле свойств

log4j.appender.file.File=${version}/logs/app.log

Ответ 3

javabot ответ о объявлении параметра-параметра для установки переменной корректен, но для извлечения его в файл свойств вам понадобится что-то вроде https://code.google.com/p/eproperties/ ( "EProperties расширяет стандартный объект java.util.Properties и синтаксис, чтобы включить такие вещи, как: замена переменных, вложенность, включение и списки".).

Вы можете посмотреть на этот предыдущий вопрос: Ссылка на другие переменные в файле свойств Java

Удачи вам в поиске решения!