Domanda

È possibile fare riferimento a variabili di ambiente di sistema (al contrario delle proprietà di sistema Java) in un file di configurazione xml log4j?

Mi piacerebbe poter fare qualcosa del tipo:

<level value="${env.LOG_LEVEL}" />

e ottenerlo dalle variabili di ambiente di sistema, quindi posso evitare di dover passare così tante cose con i parametri -D.

È stato utile?

Soluzione

Questa sintassi è documentata solo in log4j 2.X, quindi assicurati di utilizzare la versione corretta. Non funziona con le versioni 1.X.

    <Appenders>
    <File name="file" fileName="${env:LOG_PATH}">
        <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
        </PatternLayout>
    </File>
</Appenders>

Altri suggerimenti

Di recente ho provato a farlo e non sono riuscito a farlo funzionare. Quello che ho finito per fare è inviare una variabile all'avvio. Quindi supponiamo di avere una variabile d'ambiente chiamata $ LOG_LEVEL:

<level value="${log_level}" />

e all'avvio ...

java -Dlog_level=$LOG_LEVEL your_app

Penso che questo non sia supportato, ma fondamentalmente puoi fare due cose per introdurre le variabili di ambiente:

  1. Usa System.setProperty prima che Log4J venga configurato

  2. Converti (le tue) variabili di ambiente in proprietà di sistema nel tuo launcher

La prima opzione si riduce sostanzialmente a questo:

for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
  System.setProperty(entry.getKey(), entry.getValue());
}

... ma la domanda è ovviamente dove mettere questo codice. In particolare, se stai utilizzando una sorta di contenitore Tomcat o simile, questo potrebbe essere problematico.

L'altro dipende in gran parte dal tuo ambiente. Fondamentalmente se hai uno script shell che avvia la tua app, puoi scrivere un po 'di magia shell per impostare tutte le variabili di ambiente come proprietà o solo quelle che ti servono, ad es .:

java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main

È anche possibile modificare gli script di avvio del server per supportarlo, ad es. catalina.sh o simile.

Devi inserire i due punti tra env e il nome della variabile, in questo modo:

<level value="${env:LOG_LEVEL}" />

Crea una variabile di sistema. Preferisco usare setenv.bat per tali variabili.

@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0

Aggiungi riferimento nel file log4j.xml

<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
  <param name="Threshold" value="DEBUG" />
  <param name="MaxFileSize" value="512KB" />
  <param name="MaxBackupIndex" value="10" />
  <param name="File" value="${APP_LOG_ROOTDIR}/app.log"/>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d %-5p %c{1} %m %n" />
  </layout>
</appender>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top