Frage

Ist es möglich, Systemumgebungsvariablen referenzieren in einer log4j XML-Konfigurationsdatei (im Gegensatz zu Java Systemeigenschaften im Gegensatz)?

Ich möchte in der Lage sein zu tun, so etwas wie:

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

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

War es hilfreich?

Lösung

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

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

Andere Tipps

habe ich versucht, das vor kurzem zu tun und konnte es nicht bekommen zu arbeiten. Was ich am Ende ist dabei eine Variable beim Start zu schicken. So sagen Sie eine Umgebungsvariable haben $ LOG_LEVEL genannt:

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

und beim Start ...

java -Dlog_level=$LOG_LEVEL your_app

Ich denke, das nicht unterstützt wird, aber im Grunde kann man zwei Dinge tut in Ihren Umgebungsvariablen zu bringen:

  1. Verwenden System.setProperty vor Log4J wird konfiguriert

  2. Konvertieren (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 innerhalb einer Art von Tomcat-Containern oder ähnlich laufen lassen, könnte dies problematisch sein.

Die andere hängt weitgehend von Ihrer Umgebung. Grundsätzlich, wenn Sie ein 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, z.

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

Es ist auch möglich, das Server-Startskripts zu ändern, dies zu unterstützen, z.B. catalina.sh oder ähnliches.

Sie müssen einen Doppelpunkt zwischen env und dem Namen der Variablen setzen, wie folgt aus:

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

Erstellen Sie eine Systemvariable. Ich ziehe es setenv.bat für solche Variablen zu verwenden.

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

In Bezug 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top