log4j Konfiguration über JVM Argument (e)?

132

Welche Variablen muss ich als Argumente für die JVM festlegen / übergeben, damit log4j ordnungsgemäß ausgeführt wird? Und mit richtig meine ich nicht beschweren und auf der Konsole drucken. Kann ich ein typisches Beispiel sehen?

Hinweis: Ich muss vermeiden, eine log4j.properties-Datei in der Anwendung zu erstellen.

jconlin
quelle
2
Leser aufgepasst: Es ist wichtig zu beachten, dass die Frage nach log4j und nicht nach log4j2 gestellt wird.
Neves

Antworten:

159

Haben Sie eine log4j-Konfigurationsdatei? Verweisen Sie einfach mit

-Dlog4j.configuration={path to file}

Dabei sollte {Pfad zur Datei} vorangestellt werden file:

Bearbeiten: Wenn Sie mit log4j2 arbeiten, müssen Sie verwenden

-Dlog4j.configurationFile={path to file}

Entnommen aus der Antwort https://stackoverflow.com/a/34001970/552525

Brian Agnew
quelle
Brian - nicht genau das, wonach ich gesucht habe, aber ich denke, es ist ein anständiger Kompromiss zwischen dem Verschieben einer Datei in meine Anwendung und dem Festlegen der Eigenschaften über JVM-Argumente.
Jconlin
Ich denke, wenn Ihre Anwendung komplexer wird (wenn es so sein wird), wird die Datei verwaltbarer, wenn Sie sie mehr konfigurieren. Ich gebe jedoch zu, dass ich Ihren Anwendungsfall hier vermute.
Brian Agnew
25
{path to file}muss vorangestellt werden, file:damit dies funktioniert.
ODER Mapper
2
@ ORMapper - Ich habe entsprechend geändert
Brian Agnew
6
Achten Sie darauf, ob sich Log4j 2 als Eigenschaftsname und Syntax ändert. Siehe diese Antwort .
José Andias
161

Die Lösung verwendet das folgende JVM-Argument:

-Dlog4j.configuration={path to file}

Wenn die Datei nicht in dem Classpath (in WEB-INF/classesbei Tomcat) , aber irgendwo auf Sie Festplatte, Verwendung file:, wie

-Dlog4j.configuration=file:C:\Users\me\log4j.xml

Weitere Informationen und Beispiele finden Sie hier: http://logging.apache.org/log4j/1.2/manual.html

30thh
quelle
2
Für Logback:-Dlogback.configurationFile=C:\logback-test.xml
30.
2
+1 für die Erwähnung der Datei (Wiederholung dessen, was Tim gesagt hat. Dies hat mich einige Male mit log4j verrückt gemacht.
javadba
13
Ein weiteres JVM-Argument, das sehr praktisch ist, um die log4j-Konfiguration zu debuggen:-Dlog4j.debug
KC
2
Ist es möglich, mit dieser Methode einen relativen Pfad zu verwenden?
AaA
32

Dies scheint sich geändert zu haben (wahrscheinlich mit log4j2) zu:

-Dlog4j.configurationFile=file:C:\Users\me\log4j.xml

Siehe: https://logging.apache.org/log4j/2.x/manual/configuration.html

DL
quelle
Dies gibt mir die folgende Ausnahme. C: \ Development \ Eclipses \ EclipseMars \ Datei: C: \ Users \ ABC \ log4j2.xml Wie mache ich den Pfad absolut
Cybermonk
Für Docker-Container habe ich verwendet, JAVA_PARAMS="-Dlog4j.configurationFile=classpath:log4j2-container.xml"wenn das Docker-Image das Überschreiben von JAVA_PARAMS mit env-Variablen unterstützt und sich die Datei im Jar befindet.
Marcello de Sales
21

Ich weiß, dass dies bereits beantwortet wurde, aber weil Sie gesagt haben, dass dies nicht genau das ist, wonach Sie suchen, möchte ich auf die folgende Alternative hinweisen:

Sie können auch eine Konfigurationsklasse anstelle der Eigenschaften oder der XML-Datei verwenden.

-Dlog4j.configuratorClass=com.foo.BarConfigurator

Weitere Informationen finden Sie unter http://logging.apache.org/log4j/1.2/manual.html .

Tim Büthe
quelle
1
Dies ist die richtige Lösung, wenn jemand das Erstellen einer Konfigurationsdatei vermeiden möchte. Innerhalb Ihrer eigenen benutzerdefinierten Configurator-Klasse können Sie BasicConfigurator () aufrufen oder Ihre eigenen Logger und Appender erstellen, wie Sie möchten. Aber ich würde eine Konfigurationsdatei sehr bevorzugen!
Skiphoppy
11

Solange sich Ihre Datei log4j.properties im Klassenpfad befindet, sollte Log4j sie im Allgemeinen beim Start von JVM automatisch abrufen.

Natalia
quelle
1
Dies ist wahr: Die -Dlog4j.configuration wird nur benötigt, wenn sich die Datei nicht im Klassenpfad befand oder wenn Sie eine Datei verwenden möchten, die nicht die erste ist, die im Klassenpfad gefunden wurde
javadba
8

Log4J 1.x ist seit 2015 zu spät zur Party gekommen und hat EOL erreicht .

Ab Log4J 2.x sollte die JVM-Option sein-Dlog4j.configurationFile=<filename>


PS <filename>könnte eine Datei relativ zum Klassenpfad sein, ohne die file:in den anderen Antworten vorgeschlagenen.

Vineet Menon
quelle
2
Wichtige Antwort, da die anderen Antworten nicht mehr gültig sind.
Yossale
1

Relativer Pfad ist auch in Ordnung:

java -Dlog4j.configuration=file:".\log4j.properties" -jar com.your-1.0-SNAPSHOT.jar

oder

java -Dlog4j.configuration=file:".\log4j.xml" -jar com.your-1.0-SNAPSHOT.jar
Ridox
quelle
0

Wenn Sie Gradle verwenden. Sie können das Plugin 'aplication' anwenden und den folgenden Befehl verwenden

  applicationDefaultJvmArgs = [
             "-Dlog4j.configurationFile=your.xml",
                              ]
emanuel07
quelle