Angeben der Log4j2-Konfigurationsdatei beim Verwenden ausführbarer JAR

7

Ich habe Probleme, den Speicherort der Log4j2-Konfigurationsdatei anzugeben, wenn ich eine ausführbare JAR-Datei verwende. Es funktioniert gut, wenn ich alle JARs getrennt habe, aber wenn ich versuche, sie zu einer ausführbaren JAR-Datei zu kombinieren, wird die log4j2.xml -Datei aus irgendeinem Grund nicht von der Befehlszeile übernommen.

Ich habe diese zwei Methoden zur Angabe des Ortes ausprobiert:

%Vor%

Keine funktioniert. Ich habe auch versucht, das Verzeichnis, das die Konfigurationsdatei enthält, dem Klassenpfad in der JAR-Manifestdatei hinzuzufügen:

%Vor%

Ich hatte auch keinen Erfolg mit dieser Methode. Irgendwelche Ideen, was ich falsch machen könnte?

Vielen Dank im Voraus für jede Hilfe!

BEARBEITEN

Ah, ich glaube, ich habe das Problem verwechselt. Ursprünglich war dies der Fehler, den ich in der Befehlszeilenausgabe sah:

%Vor%

Aber irgendwann, während ich die Dinge änderte, änderte sich die Fehlermeldung, ohne dass ich es merkte:

%Vor%

Ich habe herausgefunden, dass die ausführbare JAR-Datei, die ich erstellt habe, die log4j-core-2.1.jar und log4j-api-2.1.jar JARs enthält und im Klassenpfad der MANIFEST -Datei ein Problem aufgetreten ist. Die Art, wie ich meine Ameisen-Datei geschrieben habe, um die Bibliotheken in die einzelne JAR zu integrieren, die ich erstellte, kopierte erfolgreich die Verzeichnisse und Klassendateien, aber kopierte die anderen Typen aus irgendeinem Grund nicht, die offensichtlich notwendig sind (zB Log4j-config .xsd, Log4j-events.dtd usw.).

Um das zu beheben, habe ich die Art geändert, in der ich die JARs in meiner Ant-Build-Datei mit dieser zusammengeführt habe:

%Vor%

Und das behob das Problem und kopierte alle Dateien aus den JARs in meine neu erstellte JAR.

Nachdem dieses Problem behoben wurde, arbeitete der zweite der oben angegebenen Befehle zum Festlegen des Speicherorts der Konfigurationsdatei. (Wie unten in @rewolf angegeben, funktioniert der erste Befehl nicht, da der Klassenpfad, der in MANIFEST der JAR angegeben wurde, alle in der Befehlszeile angegebenen Klassenpfade überschreibt.

Danke für Ihre Antworten, sie haben mir auf jeden Fall geholfen, den richtigen Weg zu finden, um meine Fehler herauszufinden.

    
Steph 18.02.2015, 02:21
quelle

4 Antworten

14

Etwas, das in der Java-Dokumentation nicht sehr gut erklärt wird, ist, dass wenn Sie ein ausführbares Jar verwenden, es nur den Klassenpfad verwenden wird, wie er in der Manifest-Datei angegeben ist. Es wird nicht auf die Argumente -cp oder --classpath gehört.

-Dlog4j.configurationFile=directory/file.xml

sollte auf jeden Fall funktionieren. Ich gehe davon aus, dass Sie auf Windows laufen, wenn Sie die Schrägstrichrichtung wählen. Sind Sie sicher, dass Sie es aus dem richtigen relativen Verzeichnis ausführen?

Aktualisieren

Ich habe es gerade in Windows ohne Probleme versucht. Ich habe das folgende Manifest verwendet:

%Vor%

Die Log4j2-Jars befinden sich in einem Verzeichnis lib/ und das log4j2.xml befindet sich im Verzeichnis conf/ . Ich habe den folgenden Befehl ausgeführt und die Konfiguration erfolgreich gefunden.

%Vor%     
rewolf 18.02.2015, 05:57
quelle
5

Ich habe das Problem gelöst, den Speicherort der log4j2-Konfiguration in einem ausführbaren Jar anzugeben, den ich aus Eclipse erstellt habe, indem ich dies in meinen Java-Code einfüge:

%Vor%

Ich habe ein Paket und deshalb musste ich den Pfad zu meinem "resources" -Ordner (in meinem "src" -Ordner in Eclipse) angeben:

%Vor%

Beachten Sie, dass "src" in meinem Pfad nicht enthalten ist und ich denke, dass der Pfad im Ordner "bin" erforderlich ist: in meinem Fall "com / company / app / resources / log4j2.xml"

Meine Konfigurationsdatei sieht folgendermaßen aus:

%Vor%

Beachten Sie auch, dass ich den Pfad der rollierenden Protokolldatei und den Namen "$ {sys: logFilename}" dynamisch zuordne, indem ich dies in meinen Java-Code einfüge:

%Vor%

Damit diese 2 dynamischen System.setProperty-Zuweisungen funktionieren, müssen sie vor der "getLogger" -Anweisung ausgeführt werden und so sieht mein Java-Code wie folgt aus:

%Vor%

}

Wenn "logger" am Anfang meiner Klasse deklariert ist (aber ohne "getLogger" vor meinen 2 System.setProperty-Anweisungen aufzurufen), kann ich "logger" in anderen Methoden referenzieren. Ich bin verpflichtet, es zu initialisieren, und so wählte ich "null", aber später aktualisieren Sie es mit der "getLogger" -Anweisung - da kann ich es nicht "final" machen (kann es nur einmal zuweisen) aber kann es statisch machen - eine konstante Klassenvariable.

nb Die 2 log4j2-Jars, die ich in den Build-Pfad aufgenommen habe, sind:

  1. log4j-api-2.6.2.jar

  2. log4j-core-2.6.2.jar

David Miller 29.09.2016 21:50
quelle
3

Für andere, die dieses Problem haben könnten ...

  1. Stellen Sie sicher, dass Ihre -Dlog4j.configurationFile -Optionen vor und nicht nach Ihrem <-jar> erscheinen. Scheint offensichtlich, aber sah diesen Fehler einmal.
  2. Versuchen Sie, den Speicherort der Datei als URL zu behandeln, und sehen Sie, ob das funktioniert. I.e. Escape-Leerzeichen mit % 20 usw. Verwenden Sie auch "file: // Pfad ", ersetzen Sie umgekehrte Schrägstriche durch Schrägstriche.
  3. Windows-Pfade können als file: // c: /path/to/log4j2.xml geschrieben werden

Wenn Sie also eine log4j2.xml in Ihrem Programmordner für Ihre exampleApp in C:\Program Files\ExampleApp haben, dann ...

%Vor%

... sollte funktionieren

    
kervin 12.05.2015 16:53
quelle
0

Ich hatte dieses Problem mit der Version 2.8 von Log4j2. Dies war vorbei, als die entsprechenden Log4j2-Jars durch die Version 2.6 von Log4j2 ersetzt wurden.

    
sujeet suryawanshi 28.01.2017 13:45
quelle