web-dev-qa-db-de.com

Wie kann ich den Standardspeicherort von log4j2.xml in Java Spring Boot ändern?

Log4j2 funktioniert gut mit Spring Boot über die log4j2.xml-Konfigurationsdatei im Stammklassenpfad, genau wie in der Dokumentation angegeben.

Beim Versuch, diese Datei an einen anderen Speicherort zu verschieben, kann ich den neuen Speicherort beim Start nicht an Spring übergeben. Aus der Dokumentation :

Die verschiedenen Protokollierungssysteme können durch Einbeziehen der entsprechenden Bibliotheken in den Klassenpfad aktiviert und durch Bereitstellen einer geeigneten Konfigurationsdatei im Stammverzeichnis des Klassenpfads oder an einem durch die Spring Environment-Eigenschaft logging.configangegebenen Speicherort weiter angepasst werden.

Ich habe versucht, den neuen Speicherort mit einer Java-Systemeigenschaft festzulegen

Java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar

oder einen externen application.properties verwenden, der die entsprechende Eigenschaft enthält

logging.config=classpath:/config/log4j2.xml

Aber ich werde regelmäßig von der folgenden Fehlermeldung begrüßt.

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
10
micpalmia

Wie in der Spring-Referenzdokumentation angegeben, kann die logging.config-Eigenschaft nicht in den Anwendungseigenschaften festgelegt werden, da sie gelesen werden, nachdem die Protokollierung bereits initialisiert wurde.

Die Lösung besteht darin, den Pfad zur externen Protokollierungskonfiguration auf folgende Weise anzugeben:

Java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar
19
micpalmia

Ich habe das gleiche Problem in meinem Projekt, neben log4j2.xml benötige ich auch andere Konfigurationsdateien im Klassenpfad. Hier sind meine 2 Lösungen, die funktionieren:

Lösung 1: Starten Sie die Spring Boot-Anwendung mit org.springframework.boot.loader.JarLauncher

Java -classpath SpringBootProject.jar;./config org.springframework.boot.loader.JarLauncher

Lösung 2: Schreiben Sie einen Klassenpfadeintrag "./config" in die MANIFEST.MF-Datei in der jar

    <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestEntries>
               <Class-Path>./config/</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.3.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
1
Harry.Chen

Die Antwort von micpalmia ist absolut richtig. 

Ich musste die Konfiguration außerhalb des Klassenpfads platzieren. Ich wollte die Konfigurationsdatei nicht als Parameter übergeben. Also habe ich eine sehr einfache Protokollierungskonfiguration in die Klassenpfadressourcen eingefügt und die Spring-Boot-Anwendung die Protokollierung beim Start neu konfigurieren müssen:

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... param) throws UnsupportedEncodingException {
        Configurator.initialize(null, "config/log4j2.xml");
        // ...
    }
}

Dieser Ansatz hat einen erheblichen Nachteil: Der gesamte Anwendungsstartvorgang wird nicht als extern konfiguriert protokolliert. Sobald der benutzerdefinierte Code ausgeführt wird, funktioniert der Logger wie beabsichtigt. Während Sie vielleicht nicht, finde ich, dass dies ein Kompromiss ist, mit dem ich leben kann.

1
konqi

Im Falle einer Eigentumsdatei:

Java -Dlog4j.configuration = file: /path/to/log4j.properties -jar app.jar

Die Befehlszeile funktioniert in Spring Boot 2. Vergessen Sie nicht, file: vor dem Pfad hinzuzufügen.

0
Atul

Ich habe eine funktionierende Lösung, um einen benutzerdefinierten Pfad festzulegen oder den vorhandenen Dateipfad für die Protokolldatei zu ändern. Wenn Sie die Datei log4j2.xml konfiguriert haben, öffnen Sie sie und sehen Sie, wo Sie eine Zeile in den Konfigurationspfad der Konfigurationsprotokolldatei ändern müssen.  enter image description here

0
SachinVsSachin