2015-02-05 4 views
9

Log4j2 arbeitet gut mit Frühlings-Boot durch die log4j2.xml Konfigurationsdatei im Classpath Wurzel, genau wie die Dokumentation Staaten. Wie kann ich den Standardspeicherort von log4j2.xml in Java Spring Boot ändern?

Beim Versuch, diese Datei an einen anderen Ort zu bewegen, obwohl ich ist nicht in der Lage den neuen Standort passiert beim Start zum Frühling. Von the documentation:

Die verschiedenen Erfassungssysteme können durch die Einbeziehung der entsprechenden Bibliotheken auf dem Classpath, und weiter besonders angefertigt durch Bereitstellung einer geeigneten Konfigurationsdatei in der Wurzel des Classpath, in einem Ort oder angegeben aktiviert werden von der Spring Environment Eigenschaft logging.config.

Ich habe versucht, den neuen Standort mit einem Java-System-Eigenschaft

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

oder mit einem externen application.properties die entsprechende Eigenschaft enthält

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

Aber ich regelmäßig durch die folgende Fehlermeldung empfangen .

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

Könnten Sie bitte bestätigen, ob '/ config' im Klassenpfad ist?Wenn Sie mavenbasiertes Projekt verwenden, legen Sie die XML-Datei unter 'src/main/resources'. – Mithun

+0

Der' config'-Ordner (Paket) befindet sich im Klassenpfad und enthält bereits 'application.yml', das korrekt abgerufen wird und erfolgreich in der Anwendung verwendet. – micpalmia

+0

Könnten Sie bitte die XML-Datei in 'src/main/resources' setzen und versuchen, das Problem einzugrenzen? – Mithun

Antwort

14

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

Die Lösung ist, den Pfad zur externen Protokollierungskonfiguration auf diese Weise zur Verfügung zu stellen:

java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar 
1

Die Antwort von micpalmia ist absolut richtig.

Ich brauchte die Konfiguration außerhalb des Classpath setzen wollte ich nicht die Config-Datei als Parameter übergeben. Also habe ich eine sehr einfache Protokollierungskonfiguration in den Classpath Ressourcen und hatte die Feder Boot-Anwendung rekonfigurieren beim Start der Anmeldung, etwa so:

@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 einen erheblichen Nachteil hat: Der gesamte Anwendung Boot-Prozess wird nicht so protokolliert werden extern konfiguriert Sobald der benutzerdefinierte Code ausgeführt wird, funktioniert der Logger jedoch wie vorgesehen. Auch wenn du es nicht magst, ich halte das für einen Kompromiss, mit dem ich leben kann.

1

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

Soluation 1: Feder Boot-Anwendung startet mit org.springframework.boot.loader.JarLauncher

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

Lösung 2: einen './config' Klassenpfadeintrag schreiben in der MANIFEST.MF im Gefäß

<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> 
Verwandte Themen