I Introduction
Le logging permet de suivre l’activité d’une application ou de mettre en place des système traces afin de déboguer plus facilement une application.
Or, dans le cadre du debogging, on a tendance à utiliser le « System.out.println() » par facilité. Ce qui n’est pas bien car c’est très loin d’être flexible au final voire générateur de perte de temps. En effet, lors de la mise en production de l’application, désactiver, effacer ou transformer ces « System.out.println() » s’avère très fastidieux. Pour cela l’utilisation d’un framework dédié va pouvoir faire gagner énormément de temps. En effet, et à titre d’exemple il peut être spécifié plusieurs sorties (console, fichier de log, serveur de logs, etc) en fonction des types de messages de log…
Ainsi ce petit mémo est juste pour montrer comment intégrer log4J dans un projet netbeans… Bien-sûr ce n’est pas exhaustif et cet article est une première ébauche … après à chacun de prendre son envol 🙂
Plateforme utilisée :
- OS UBUNTU 20.4
- Netbeans IDE 12.5
- projet java avec MAVEN
II Déclaration MAVEN pour récupérer le bibliothèque LOG4J
Créer un projet java « maven » sous Netbean.
Dans le fichier POM indiquer quelle source prendre :
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
III Exemple de code source
Ci-dessous un premier exemple de code source pour utiliser le system de logger.
package com.union31.test_gson;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class gson_json {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.debug("msg de debogage");
logger.info("msg d'information");
logger.warn("msg d'avertissement");
logger.fatal("msg d'erreur fatale");
logger.error("msg d'erreur");
logger.info("Hello, World!");
}
}
Résultat dans la console d’exécution :
-----------------------< com.union31:test_GSON >------------------------
Building test_GSON 1.0-SNAPSHOT
--------------------------------[ jar ]---------------------------------
--- exec-maven-plugin:3.0.0:exec (default-cli) @ test_GSON ---
19:16:55.927 [main] FATAL com.union31.test_gson.gson_json - msg d'erreur fatale
19:16:55.927 [main] ERROR com.union31.test_gson.gson_json - msg d'erreur
On remarque que par défaut seuls les messages de type « ERROR » et « FATAL » sont pris en compte.
IV Fichier de configuration
IV.1 Création d’un fichier
Pour voir les messages de type « DEBUG » ou autres il faut modifier la configuration par défaut de log4j.
Pour cela il faut créer un fichier de configuration. Pour le détail du fichier de configuration : lien
Dans notre cas il a été décidé d’utiliser un fichier xml. Ce dernier contient les lignes suivantes :
<?xml version="1.0" encoding="UTF-8"?>
<Configuration 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>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
On indiquera <Root level= »debug« > pour afficher tous les types de log
IV.2 Forcer la localisation du fichier
Sous Netbeans n’ayant pas su trouver où placer précisément le fichier de configuration dans le projet, il a été opté de forcer l’emplacement du fichier.
IV.2.1 Via les arguments de la JVM
Pour cela il faut indiquer lors de l’exécution du code son emplacement par une directive spécifique. Ainsi il faut aller dans les propriétés du projet, catégorie « run ». Puis dans le champ « VM options » ajouter la directive suivante :
-Dlog4j2.configurationFile=/chemin/test_GSON/src/main/java/log4j2.xml
IV.2.2 Via le code java en utilisant system.property
C’est de mon point de vue la meilleure façon de faire car tout est embarqué dans le code …
Exemple ci-dessous par l’ajout du bloc static….:
package com.union31.test_gson;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class gson_json {
static {
String chemin_fichier_conf = System.getProperty("user.dir") + "/src/main/java/log4j2.xml";
System.setProperty("log4j2.configurationFile", chemin_fichier_conf);
}
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.debug("msg de debogage");
logger.info("msg d'information");
logger.warn("msg d'avertissement");
logger.fatal("msg d'erreur fatale");
logger.error("msg d'erreur");
logger.info("Hello, World!");
}
}
IV.3 Forcer le mode debug (jvm arguments)
Pour voir si le fichier est bien pris en compte, il est possible de passer le module log4j en mode debug.
pour cela l’option à ajouter dans les arguments de la vm et la suivante :
-Dlog4j2.debug
Ce qui a pour effet dans la console d’exécution l’exemple suivant :
-----------------------< com.union31:test_GSON >------------------------
Building test_GSON 1.0-SNAPSHOT
--------------------------------[ jar ]---------------------------------
--- exec-maven-plugin:3.0.0:exec (default-cli) @ test_GSON ---
DEBUG StatusLogger Using ShutdownCallbackRegistry class org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry
DEBUG StatusLogger Not in a ServletContext environment, thus not loading WebLookup plugin.
DEBUG StatusLogger AsyncLogger.ThreadNameStrategy=UNCACHED (user specified null, default is UNCACHED)
TRACE StatusLogger Using default SystemClock for timestamps.
DEBUG StatusLogger org.apache.logging.log4j.core.util.SystemClock supports precise timestamps.
DEBUG StatusLogger Not in a ServletContext environment, thus not loading WebLookup
...
DEBUG StatusLogger createLoggers(={root})
DEBUG StatusLogger Configuration XmlConfiguration[location=/home/xavior/Documents/Dev/DEV/Netbeans/test_GSON/test_GSON/src/main/java/log4j2.xml] initialized
DEBUG StatusLogger Starting configuration XmlConfiguration[location=/home/xavior/Documents/Dev/DEV/Netbeans/test_GSON/test_GSON/src/main/java/log4j2.xml]
DEBUG StatusLogger Started configuration XmlConfiguration[location=/home/xavior/Documents/Dev/DEV/Netbeans/test_GSON/test_GSON/src/main/java/log4j2.xml] OK.
TRACE StatusLogger Stopping org.apache.logging.log4j.core.config.DefaultConfiguration@7a5d012c...
...
IV.4 Autres directives
Lien pour connaître les autres directives : lien
V Coloration dans la console de sortie dans Netbeans (12.5) avec un projet MAVEN
V.1 Exemple de directive de configuration log4j
Pour obtenir des log en couleur il faut modifier le pattern de sortie. Ainsi cela se traduit par une configuration de ce type dans le fichier xml de log4j :
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout disableAnsi="false" pattern="%highlight{%d{HH:mm:ss.SSS} [%-5level] %logger{36}.%M() ligne:%L - %msg%n}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=black, DEBUG=green bold, TRACE=blue}"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Une fois enregistré, ces paramètres dans Netbeans avec un projet MAVEN ne fonctionnent pas : le texte reste noir et blanc :

V.2 Activer la couleur …
Après plusieurs heures de recherche, il s’avère que le module Maven embarqué dans l’EDI de Netbeans ne prend pas en charge la gestion des couleurs.
Il faut alors installer Maven. Ici sous Ubuntu :
sudo apt install maven
Ensuite il faut indiquer à Netbeans d’utiliser ce Maven : menu « Tools » puis « Options »

Dans « Maven Home » indiquer le chemin de maven nouvellement installé : /usr/share/maven puis cliquer sur « OK ».
A la prochaine exécution, la coloration apparaît :

V.3 Retrouver les éléments initiaux de Maven
Depuis l’utilisation d’un Maven externe, il se trouve qu’il est plus verbeux que le Maven embarqué.
Et pour modifier les paramètres, il faut le faire manuellement. Pour cela on modifie le fichier /usr/share/maven/conf/logging/simplelogger.properties
org.slf4j.simpleLogger.defaultLogLevel=error
org.slf4j.simpleLogger.showDateTime=false
org.slf4j.simpleLogger.showThreadName=false
org.slf4j.simpleLogger.showLogName=false
org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.cacheOutputStream=true
org.slf4j.simpleLogger.levelInBrackets=true
org.slf4j.simpleLogger.log.Sisu=info
org.slf4j.simpleLogger.warnLevelString=WARNING
En passant le paramètre « defaultLogLevel » à error, Maven sera moins verbeux 🙂 . Pour plus d’info : lien
VI Liens utiles
Site officiel | https://logging.apache.org/log4j/ |
Présentation de l’outils (FR) | https://www.jmdoudoux.fr/java/dej/chap-logging.htm |