web-dev-qa-db-fra.com

Comment puis-je changer l'emplacement par défaut de log4j2.xml dans Java Spring Boot?

Log4j2 fonctionne correctement avec Spring Boot via le fichier de configuration log4j2.xml dans le chemin de classe racine, exactement comme le stipule la documentation.

Lorsque vous essayez de déplacer ce fichier vers un emplacement différent, je ne parviens pas à transmettre le nouvel emplacement à Spring au démarrage. De la documentation :

Les différents systèmes de journalisation peuvent être activés en incluant les bibliothèques appropriées sur le chemin de classe, puis personnalisés en fournissant un fichier de configuration approprié à la racine du chemin de classe, ou à un emplacement spécifié par la propriété Spring Environment logging.config.

J'ai essayé de définir le nouvel emplacement avec une propriété système Java

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

ou en utilisant un application.properties externe contenant la propriété correspondante

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

Mais je suis régulièrement accueilli par le message d'erreur suivant.

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

Comme indiqué dans la documentation de référence Spring , la propriété logging.config ne peut pas être définie parmi les propriétés de l'application, car elles sont lues après l'initialisation de la journalisation.

La solution consiste à fournir le chemin d'accès à la configuration de journalisation externe de la manière suivante:

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

J'ai le même problème dans mon projet, outre log4j2.xml, j'ai également besoin d'autres fichiers de configuration dans le chemin de classe. Voici mes 2 solutions qui fonctionnent:

Soluation 1: démarrez l'application de démarrage de printemps avec org.springframework.boot.loader.JarLauncher

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

Solution 2: écrivez une entrée de chemin de classe './config' dans MANIFEST.MF dans le fichier 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

La réponse de micpalmia est tout à fait correcte. 

Je devais mettre la configuration en dehors du classpath. Je ne voulais pas passer le fichier de configuration en tant que paramètre. J'ai donc mis une configuration de journalisation très simple dans les ressources du chemin de classes et l'application de démarrage printanière a reconfiguré la journalisation au démarrage, comme suit:

@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");
        // ...
    }
}

Cette approche présente un inconvénient majeur: l'ensemble du processus de démarrage de l'application ne sera pas consigné comme configuré de manière externe. Mais une fois le code personnalisé exécuté, l’enregistreur fonctionne comme prévu. Bien que vous ne puissiez pas, je trouve que c'est un compromis avec lequel je peux vivre.

1
konqi

En cas de fichier de propriété:

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

Pour que la ligne de commande fonctionne dans Spring Boot 2. N'oubliez pas d'ajouter le fichier: avant le chemin.

0
Atul

J'ai la solution de travail pour définir le chemin personnalisé ou modifier le chemin de fichier existant pour le fichier de journalisation. Si vous avez configuré le fichier log4j2.xml, ouvrez-le et voyez où vous devez modifier une ligne pour configurer le chemin du fichier journal de configuration.  enter image description here

0
SachinVsSachin