2015-07-28 20 views
15

Tipo di puzzle qui.Come definire le variabili negli xml di primavera da utilizzare in log4j.properties

Ho un'applicazione in WAR. Ci sono web.xml e application context.xml lì, e anche log4j.properties. Questa WAR funziona in tomcat.

Esiste la possibilità di utilizzare alcune variabili in log4j.properties, ad es. log4j.appender.file.File=${catalina.base}/logs/app.log

Voglio definire una variabile in web.xml o context.xml e usarla in log4j.properties. Ad esempio, in qualche modo impostare version=1.1 e utilizzare log4j.appender.file.File=${catalina.base}/logs/app-${version}.log. Non dovrebbe essere una variabile di ambiente.

Posso farlo senza ricompilare l'app?

ADD non dovrebbe pregiudicare nulla, ma solo nel caso in cui ...

sua web.xml si presenta così:

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

risposta

0

Penso che si possa fare questo dichiarando un contesto -param in web.xml e usando quel nome param nel file delle proprietà che vuoi inserire o qualsiasi altra cosa.

in web.xml

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

nel file di proprietà

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

Questo dovrebbe funzionare con un riavvio del server, senza la compilazione necessario.

Si può anche provare a impostare una proprietà da xml e accedere a ti dal file delle proprietà.

in web.xml

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

nel file di proprietà

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

No, non è così. Almeno in tomcat-7.0.52 non fornisce messaggi di errore/avviso, ma crea 'logs/app-.log' invece di' logs/app-1.1 previsti.log' quando 'logs/app - $ {version} .log' specificato. –

+0

hai provato a impostare una proprietà da xml e ad accedervi dal file delle proprietà? – javabot

+0

sopra ha funzionato per me quando ho controllato. – javabot

9

Fare una sottoclasse di org.springframework.web.util.Log4jConfigListener che espongono version valore come variabili di sistema (e, naturalmente, è possibile passare il valore tramite sistema standard/Variabile d'ambiente 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); 
    } 
} 

e correggere la risposta di tuo javabot 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

Quindi tu dici che non posso farlo senza ricompilare l'app. Ho capito bene? –

+0

Supponi di avere diverse istanze dell'app in un contenitore. Non interferirebbe attraverso l'ambiente/variabile jvm (singolo per contenitore)? –

+0

@AndreyRegentov. Puoi farlo senza ricompilare l'app passando il valore tramite la variabile di ambiente standard System/Java. – FoxyBOA

0

sulla dichiarazione di un contesto-param per impostare la variabile è corretto, ma al fine di recuperarlo nelle proprietà file può essere qualcosa di simile a https://code.google.com/p/eproperties/ ("EProperties estende l'oggetto e la sintassi java.util.Properties standard per includere elementi quali: sostituzione di variabili, annidamento, inclusione ed elenchi.").

Si consiglia di guardare a questo domanda precedente: Reference other variables in Java properties file

Buona fortuna a voi a trovare la soluzione!