2015-07-28 16 views
15

Rodzaj zagadki tutaj.Jak zdefiniować zmienne w xmls wiosennych do użycia w log4j.properties

Mam aplikację w WAR. Dostępne są pliki web.xml i application.xml, a także plik log4j.properties. Ta wojna działa w tomcat.

Istnieje możliwość użycia niektórych zmiennych w pliku log4j.properties, np. log4j.appender.file.File=${catalina.base}/logs/app.log

Chcę zdefiniować zmienną w pliku web.xml lub context.xml i użyć jej w pliku log4j.properties. Na przykład w jakiś sposób ustaw version=1.1 i użyj log4j.appender.file.File=${catalina.base}/logs/app-${version}.log. Nie powinna to być zmienna środowiskowa.

Czy mogę to zrobić bez ponownej kompilacji aplikacji?

DODAJ nie powinno mieć wpływu na cokolwiek, ale na wszelki wypadek ...

Jego web.xml wygląda następująco:

<?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> 

Odpowiedz

0

myślę, że można to zrobić deklarując kontekst -param w web.xml i używając tej nazwy paramu w pliku właściwości, który chcesz umieścić wersję lub cokolwiek innego.

w web.xml

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

w pliku właściwości

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

To powinno działać przy ponownym uruchomieniu serwera, nie kompilacja potrzebne.

Możesz także spróbować ustawić właściwość z xml i uzyskać dostęp do ti z pliku właściwości.

w web.xml

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

w pliku właściwości

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

Nie, nie ma. Przynajmniej w tomcat-7.0.52 nie wyświetla żadnych komunikatów o błędach/ostrzeżeniach, ale tworzy 'logs/app-.log' zamiast oczekiwanych' logs/app-1.1.log' po określeniu opcji 'logs/app - $ {version} .log'. –

+0

Czy próbowałeś ustawić właściwość z xml i dostęp do niego z pliku właściwości? – javabot

+0

powyższe pracował dla mnie, gdy sprawdziłem. – javabot

9

Zrób podklasę org.springframework.web.util.Log4jConfigListener że narazi version jako wartość zmiennej systemowej (i oczywiście można przekazać wartość poprzez standardowy System/Zmienna środowiskowa 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); 
    } 
} 

i naprawić odpowiedź na swoje 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> 
    ... 
+0

Mówisz, że nie mogę tego zrobić bez ponownej kompilacji aplikacji. Czy dobrze to rozumiem? –

+0

Załóżmy, że masz kilka wystąpień aplikacji w jednym kontenerze. Czy nie zakłóciłoby to środowiska/zmiennej jvm (pojedynczej na pojemnik)? –

+0

@AndreyRegentov. Możesz to zrobić bez ponownej kompilacji aplikacji, przekazując wartość za pomocą standardowej zmiennej środowiskowej System/Java. – FoxyBOA

0

Javabot za około deklarowania kontekstowe-param ustawić zmienną jest poprawna, ale w celu odzyskania go we właściwościach pliku trzeba będzie coś podobnego https://code.google.com/p/eproperties/ ("Właściwości zewnętrzne rozszerzają standardowy obiekt java.util.Properties i składnię o takie elementy, jak: podstawianie zmiennych, zagnieżdżanie, włączanie i listy.").

Możesz spojrzeć na to poprzednie pytanie: Reference other variables in Java properties file

Powodzenia wam w znalezieniu rozwiązania!

Powiązane problemy