2017-10-04 1 views
1

In meinem Java-Programm möchte ich mehrere Protokolldateien verwenden.log4J2 Speichern und verwenden Variablen/Lookup-Werte

Also nach der log4j Dokumentation würde ich annehmen, dass Lookup-Werte verwendet werden, um das zu tun.

Die Seite Lookups beschreibt, wie die Konfigurationsdateien erstellt werden. Hat aber nur wenig Informationen darüber, wie die Werte gespeichert werden, damit die Konfigurationsdatei die Werte abruft.

So möchte ich Logfilename dynamisch gefüllt haben.

-Test mit envrimonment Werken:

<File name="MyFile" fileName="${env:USERERNAME}" immediateFlush="false" append="false"> 
     <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
</File> 

Ich würde davon ausgehen, dass System.getProperty("USER")${java:USER} den Java-Lookup passen würde, aber es funktioniert nicht. mit

testete ich beide Variablen:

System.out.println("USER: " + System.getProperty("USER")); 
System.out.println("USERNAME: " + System.getenv("USERNAME")); 

So wie die Variablen

, die die Unterschiede für

  • Context Map Lookup
  • Java-Lookup füllen ?

+0

ist es nicht nur ein Tippfehler? (Sie haben '$ {env: USERERNAME}' geschrieben) –

+0

nein - ich habe die Frage geklärt, um –

+0

zu verdeutlichen Ich meinte in Ihrer Config: '

Antwort

1

Es gibt verschiedene Möglichkeiten zum Suchen in log4j2. Lassen Sie mich einige Details ergänzen -

Context Map Lookup - Für Wert setzen Kontext Karte verwenden, verwenden Sie folgenden Code -

org.apache.logging.log4j.ThreadContext.put("logFileName", "app.log"); 

Variable kann mit ${ctx:logFileName} oder %X{logFileName} in der Konfigurationsdatei zugegriffen werden.

Kontext Map Lookup wird im Allgemeinen in Web-Anwendung verwendet, wo Sie einen Wert für jede Benutzeranforderung wünschen, d. H. Für jede thread.

Umwelt Lookup - Umwelt-Lookup zum Nachschlagen Systemumgebungsvariablen wie USERNAME, PLATFORM verwendet. Sie können alle Umgebungsvariablen in Java drucken unter Verwendung -

System.out.println(System.getenv()); 

oder irgendeine spezifische Umgebungsvariable -

System.out.println(System.getenv("NUMBER_OF_PROCESSORS")); 

jedoch von Java-Programm, können Sie festlegen, Umgebungsvariablen nicht.

Wie Sie in Ihrem Code erwähnt haben, kann auf Umgebungsvariablen unter Verwendung der Syntax ${env:NUMBER_OF_PROCESSORS} zugegriffen werden.

Java Lookup - Java-Lookup ist für Java-Umgebung Informationen wie java version, hardware usw. Variablen festgelegt ist und nicht in Java-Programm eingestellt werden.

Auf solche Variablen kann unter Verwendung der ${java:vm} Syntax zugegriffen werden, wobei vm java-Umgebungsvariablenname ist.

Systemeigenschaften Lookup - Es ist leicht zu bekommen und solche Eigenschaften mit folgendem Code festgelegt -

System.setProperty("logFileName", "app.log"); 
System.getProperty("logFileName"); 

Variablen können in log4j2 Konfigurationsdatei ${sys:logFileName} Syntax zugegriffen werden.

Eine gute Sache über diese Systemeigenschaften ist, dass Sie diese Eigenschaften als VM Arguments an Ihr Programm wie -DlogFileName=app3.log übergeben können.

Es gibt andere Nachschlagemechanismus wie auch Datum Lookup, Map Lookup usw., die hauptsächlich verwendet werden. Rest Details können here


geprüft werden, da Sie Dateinamen dynamisch in Ihrer Anwendung festlegen möchten, und wenn Sie den Dateinamen nur einmal einstellen wollen, würde ich Ihnen System property vorschlagen. Aber stellen Sie sicher, dass Sie System Property vor der Initialisierung setzen log4j

+0

Sehr gut, einfache und sogar detaillierte Erklärung - muchas gracias –

Verwandte Themen