Konfiguracja log4j za pośrednictwem argumentów JVM?

134

Jakie zmienne muszę ustawić / przekazać jako argumenty do maszyny JVM, aby log4j działał poprawnie? Mówiąc właściwie, mam na myśli nie narzekać i nie drukować do konsoli. Czy mogę zobaczyć typowy przykład?

Uwaga: Muszę unikać tworzenia pliku log4j.properties w aplikacji.

jconlin
źródło
2
Uwaga czytelnika: ważne, aby zauważyć, że pytanie dotyczy log4j, a nie log4j2.
neves

Odpowiedzi:

164

Czy masz plik konfiguracyjny log4j? Po prostu odwołaj się do niego za pomocą

-Dlog4j.configuration={path to file}

gdzie {ścieżka do pliku} powinna być poprzedzona przedrostkiem file:

Edycja: jeśli pracujesz z log4j2, musisz użyć

-Dlog4j.configurationFile={path to file}

Zaczerpnięte z odpowiedzi https://stackoverflow.com/a/34001970/552525

Brian Agnew
źródło
Brian - nie do końca to, czego szukałem, ale myślę, że to przyzwoity kompromis między przeniesieniem pliku do mojej aplikacji a ustawieniem właściwości za pomocą argumentów JVM.
jconlin
Myślę, że gdy twoja aplikacja stanie się bardziej złożona (jeśli będzie), plik stanie się łatwiejszy w zarządzaniu, gdy będziesz go bardziej konfigurować. Jednak przyznaję, że zgaduję co do twojego przypadku użycia tutaj.
Brian Agnew
27
{path to file}musi być poprzedzony, file:aby to zadziałało.
LUB Mapper
2
@ORMapper - Poprawiłem odpowiednio
Brian Agnew,
6
Uważaj, jeśli zmieniono nazwę właściwości i składnię Log4j 2 . Zobacz tę odpowiedź .
José Andias
163

Rozwiązanie wykorzystuje następujący argument JVM:

-Dlog4j.configuration={path to file}

Jeśli plik NIE znajduje się w ścieżce klas (w WEB-INF/classesprzypadku Tomcata), ale gdzieś na dysku, użyj file:, na przykład

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

Więcej informacji i przykładów tutaj: http://logging.apache.org/log4j/1.2/manual.html

30thh
źródło
2
Do Logback:-Dlogback.configurationFile=C:\logback-test.xml
30
2
+1 za wzmiankę o pliku (powtarzam to, co powiedział Tim. To doprowadzało mnie do szaleństwa z log4j kilka razy.
javadba
13
Kolejny argument JVM bardzo przydatny do debugowania konfiguracji log4j:-Dlog4j.debug
KC
2
Czy w tej metodzie można użyć ścieżki względnej?
AaA
34

Wygląda na to, że zmieniło się to (prawdopodobnie z log4j2) na:

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

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

DL
źródło
To daje mi następujący wyjątek. C: \ Development \ Eclipses \ EclipseMars \ file: C: \ Users \ ABC \ log4j2.xml Jak ustawić ścieżkę jako absolutną
Cybermonk
W przypadku kontenerów Docker użyłem, JAVA_PARAMS="-Dlog4j.configurationFile=classpath:log4j2-container.xml"jeśli obraz platformy Docker obsługuje zastępowanie JAVA_PARAMS zmiennymi env, a plik znajduje się wewnątrz Jar.
Marcello de Sales
21

Wiem, że na to już odpowiedź, ale ponieważ powiedziałeś, że nie jest to dokładnie to, czego szukasz, chciałbym wskazać następującą alternatywę:

Możesz także użyć klasy konfiguracji zamiast właściwości lub pliku xml.

-Dlog4j.configuratorClass=com.foo.BarConfigurator

Szczegółowe informacje można znaleźć pod adresem http://logging.apache.org/log4j/1.2/manual.html .

Tim Büthe
źródło
1
To właściwe rozwiązanie, jeśli ktoś chce uniknąć tworzenia pliku konfiguracyjnego. Wewnątrz własnej niestandardowej klasy Configurator możesz wywołać BasicConfigurator () lub utworzyć własne Loggery i Appendery w dowolny sposób. Ale wolałbym plik konfiguracyjny!
skiphoppy
11

Ogólnie rzecz biorąc, o ile plik log4j.properties znajduje się w ścieżce klas, Log4j powinien automatycznie pobierać go podczas uruchamiania maszyny JVM.

Natalia
źródło
1
To prawda: konfiguracja -Dlog4j. jest potrzebna tylko wtedy, gdy plik nie znajdował się w ścieżce klasy lub jeśli chcesz użyć pliku, który nie jest pierwszym znalezionym w ścieżce klas
javadba
8

Spóźniony na imprezę od 2015 roku, Log4J 1.x osiągnął EOL .

Log4J 2.x i nowsze, opcja JVM powinna być-Dlog4j.configurationFile=<filename>


PS <filename>może być plik względną do ścieżki klasy bezfile: jak sugerowano w innych odpowiedzi.

Vineet Menon
źródło
2
Ważna odpowiedź, ponieważ inne odpowiedzi nie są już aktualne.
Yossale
1

Względna ścieżka jest również w porządku:

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

lub

java -Dlog4j.configuration=file:".\log4j.xml" -jar com.your-1.0-SNAPSHOT.jar
ridox
źródło
0

Jeśli używasz gradle. Możesz zastosować wtyczkę „aplication” i użyć następującego polecenia

  applicationDefaultJvmArgs = [
             "-Dlog4j.configurationFile=your.xml",
                              ]
emanuel07
źródło