2014-02-25 13 views
29

Ich frage mich nur, ob es eine Möglichkeit gibt, Vorschlagswert für die Eigenschaftsersetzung in LOG4J bereitzustellen?Log4J2 Eigenschaftsersatz - Standard

Ich möchte Dateipfad in Java-Systemeigenschaft übergeben und dann mit "$ {env: mySystemProperty}" verwenden. Was aber, wenn Entwickler vergisst diese Eigenschaft zu setzen? Dann hätte ich gern einen sinnvollen Standardwert in log4j2.xml definiert.

Irgendeine Idee, wie man diese Funktionalität erreicht?

EDIT:

Das env-Substitution für mich nicht funktioniert:

standalone.conf

-DoauthLoginLogPath=/path/oauth2.log 

log44j2.xml

<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true"> 
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true"> 

ich in Wildfly sehen kann die Konsole Habe den Server neu gestartet, aber ich kann es nicht schaffen.

Antwort

42

Standardeigenschaft Karte

Mit Blick auf http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution können Sie eine Standardeigenschaft Karte in der Konfigurationsdatei angeben. Das nimmt diese Form:

<Configuration status="debug"> 
    <Properties> 
    <Property name="oauthLoginLogPath">default/location/of/oauth2.log</Property> 
    </Properties> 
    ... 
    <Appenders> 
    <Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}"> 
    .... 
</Configuration 

Dann, wenn Sie Ihre Anwendung mit Systemeigenschaft -DoauthLoginLogPath=/path/oauth2.log, die Datei appender fileName Wert startet zuerst in Systemeigenschaften nachgeschlagen werden, aber wenn das nicht funktioniert, wird es auf die Eigenschaft zurückgreifen definiert im Bereich Properties oben in der Konfigurationsdatei log4j2.xml.

Inline

Eine zweite Möglichkeit ist, den Standardwert inline zu bieten:

<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}"> 

Generell sind alle Log4j2 Lookups folgen diesem Muster: ${type:key:-defaultValue}.

Env vs sys

By the way, der env Präfix ist für Umgebungsvariablen (zB% PATH% unter Windows), und ist nicht auf sys, bezogen die Java-Systemeigenschaften sind. Siehe auch http://logging.apache.org/log4j/2.x/manual/lookups.html

+0

Es funktioniert genau Sie beschrieben. Vielen Dank. –

+0

Ich weiß nicht, ob es in einer früheren Version funktioniert hat, aber das funktioniert nicht mehr. Sie müssen ': -' in der Eigenschaft verwenden, um den Standardwert zu definieren. – GoGoris

12

Sie können dieselbe ${sys:propName:-default} Syntax verwenden. Beachten Sie das ': -', es heißt "variabler Standardwert Delimiter". Der Standardwert für den "variable Standardwert delimiter" :- ist, wie in bash und anderen * Nichts Muscheln.

Sie können mehr darüber in der Log4j 2 Dokumentation für die StrSubstitutor Klasse lesen.

das gleiche Beispiel verwenden:

<Configuration status="debug"> 
    ... 
    <Appenders> 
     <Appender type="File" name="File" 
        fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}"> 
     .... 
    </Appenders> 
</Configuration> 
+0

Das hat perfekt für mich funktioniert. – chaitanya

+0

Leider werden die Standardwerte zum Zeitpunkt des Ladens der Datei log4j2.xml aufgelöst. Es funktioniert nicht, um Standardwerte für z.B. Variablen, die über den Threadkontext injiziert werden sollen. – rec

+1

Korrektur: funktioniert, aber man muss ein zweites '$' hinzufügen, z. '$$ {ctx: Benutzername: -UNKNOWN}' :) – rec