Dernièrement, j'ai décidé d'apprendre à utiliser l'enregistreur log4j2. J'ai téléchargé les fichiers JAR requis, créé la bibliothèque, le fichier de configuration XML et essayé de l'utiliser. Malheureusement, je reçois cette déclaration dans la console (Eclipse):
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Ceci est mon code de classe de test:
package log4j.test;
import org.Apache.logging.log4j.LogManager;
import org.Apache.logging.log4j.Logger;
public class Log4jTest
{
static final Logger logger = LogManager.getLogger(Logger.class.getName());
public static void main(String[] args) {
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
logger.fatal("fatal");
}
}
Et mon fichier de configuration xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test"
status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="log4j.test.Log4jTest" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
J'ai aussi essayé avec XML sans balises <Logger>
, la spécification de paquet et divers répertoires de dossiers/paquets, mais cela n'a pas aidé. Maintenant, mon fichier log4j2.xml
se trouve directement dans le dossier du projet dans Eclipse.
S'agit-il d'un simple projet Eclipse Java sans Maven, etc.? Dans ce cas, vous devrez placer le fichier log4j2.xml
dans le dossier src
pour pouvoir le trouver sur le chemin de la classe . Si vous utilisez maven, mettez-le sous src/main/resources
ou src/test/resources
.
Vous devez choisir l'une des solutions suivantes:
A suivi les documentations - Apache Log4j2 Configuratoin et Apache Log4j2 Maven dans la configuration de log4j2 avec yaml. Selon la documentation, les dépendances maven suivantes sont requises:
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
et
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.8.6</version>
</dependency>
Le simple fait d’ajouter ces éléments n’a pas retenu la configuration et a toujours généré une erreur. La manière de déboguer la configuration en ajoutant -Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE
a aidé à voir les journaux. Plus tard, il a fallu télécharger le code source avec Maven et le débogage a permis de mieux comprendre les classes dépendantes de log4j2. Ils sont listés dans org.Apache.logging.log4j.core.config.yaml.YamlConfigurationFactory
:
com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory
L'ajout d'un mappage de dépendance pour jackson-dataformat-yaml
n'aura pas les deux premières classes. Par conséquent, ajoutez la dépendance jackson-databind
pour que la configuration de yaml fonctionne:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
Vous pouvez ajouter la version en vous référant à la section Test Dependencies
de l’élément de version log4j-api
de MVN Repository . Par exemple. pour la version 2.8.1 de log4j-api, reportez-vous à ce link et localisez la version jackson-databind
.
De plus, vous pouvez utiliser le code Java ci-dessous pour vérifier si les classes sont disponibles dans le classpath:
System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
"com.fasterxml.jackson.databind.JsonNode",
"com.fasterxml.jackson.core.JsonParser",
"com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};
for(String className : classes) {
cl.loadClass(className);
}
Eclipse ne verra jamais un fichier tant que vous ne forcez pas l'actualisation de l'EDI. C'est une fonctionnalité! Ainsi, vous pouvez mettre le fichier dans tout le projet et Eclipse l'ignorera complètement et émettra ces erreurs. Cliquez sur Actualiser dans la vue du projet Eclipse, puis cela fonctionnera.
En plus de ce que Tomasz W a écrit, en démarrant votre application, vous pouvez utiliser les paramètres suivants:
-Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE
pour obtenir la plupart des problèmes de configuration.
Pour plus de détails, voir FAQ Log4j2: Comment déboguer ma configuration?
Dans mon cas, je devais le placer dans le dossier bin de mon projet, même si mon chemin d'accès aux classes était défini sur le dossier src. Je ne sais pas pourquoi, mais ça vaut le coup d'essayer.