2008-10-14 15 views
40

Ist es möglich, Systemumgebungsvariablen (im Gegensatz zu Java-Systemeigenschaften) in einer log4j xml-Konfigurationsdatei zu referenzieren?Verwendung von Systemumgebungsvariablen in der log4j xml-Konfiguration

Ich mag würde in der Lage sein, wie etwas zu tun ist:

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

und hat es, dass bekommen von den Systemumgebungsvariablen, so kann ich vermeiden, in so viele Dinge mit -D Parametern passieren zu müssen.

+0

ich auf die meisten upvoted Antwort nur kommentiert und erklärt meine Argumentation. Ich habe gerade die Antwort, die ich angenommen habe, für das, was es wert ist, aufgewertet. –

Antwort

12

Diese Syntax nur in log4j 2.X dokumentiert ist, so stellen Sie sicher, dass die richtige Version verwenden. Bei den 1.X-Versionen funktioniert es nicht.

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

Ich habe versucht, das vor kurzem zu tun und konnte es nicht zum Laufen bringen. Was ich getan habe, ist eine Variable beim Start zu senden. So sagen Sie eine Umgebungsvariable $ haben LOG_LEVEL genannt:

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

und beim Start ...

java -Dlog_level=$LOG_LEVEL your_app 
+0

Ich fragte speziell, wie man das macht * ohne * sie alle als -D-Parameter einstellen zu müssen, so dass dies meine Frage überhaupt nicht beantwortet. –

11

Ich denke, das nicht unterstützt wird, aber im Grunde kann man zwei Dinge tun in Ihrer Umgebung zu bringen Variablen:

  1. Verwenden System.setProperty vor Log4J wird konfiguriert

  2. Convert (Ihre) Umgebungsvariablen Systemeigenschaften in Launchers

Die erste Option kocht im Grunde auf diese nach unten:

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

... aber die Frage ist natürlich, wo Sie diesen Code setzen . Insbesondere, wenn Sie in einer Art Tomcat-Container oder ähnlichem laufen, könnte dies problematisch sein.

Der andere hängt weitgehend von Ihrer Umgebung ab. Grundsätzlich, wenn Sie einen Shell-Skript, das die App gestartet wird, können Sie einige Shell Magie schreiben alle Umgebungsvariablen als Eigenschaften einzustellen, oder nur die, die Sie benötigen, zB:

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

Es ist auch möglich, Ihren Serverstart zu ändern Skripte, um dies zu unterstützen, z catalina.sh oder ähnlich.

2

Sie benötigen einen Doppelpunkt zwischen env und dem Namen der Variablen zu setzen, wie folgt aus:

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

Erstellen Sie eine Systemvariable. Ich bevorzuge die Verwendung von setenv.bat für solche Variablen.

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

Add Referenz in log4j.xml Datei

<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> 
+0

Hat die Syntax, die Sie dort zeigen, $ {APP_LOG_ROOTDIR} Systemumgebungsvariablen und nicht nur Java-Systemeigenschaften? Mein Verständnis (und meine Erfahrung) bestand darin, dass nur Java-Systemeigenschaften und keine Umgebungsvariablen betrachtet werden. –

+0

@DerekLewis Ja, die Syntax betrachtet Systemumgebungsvariablen. Diese Variablen stehen Tomcat beim Start zur Verfügung, ähnlich wie die Variablen, die tomcat über das Skript _setenv.bat_ gesetzt hat. Beachten Sie, ich habe dies nur für Windows verwendet. Das ist kein Problem für mich auf * nix, also musste ich nie diese Lösung verwenden. – KingJahfy