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.
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
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>
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.
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.
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.