L'écosystème Java propose plusieurs solutions robustes pour la gestion des logs. Parmi elles, SLF4J sert de façade pour une abstraction de journalisation, permettant aux développeurs d'utiliser différentes implémentations de logging sans modifier le code applicatif. Log4j2, développé par Apache, est une implémentation moderne qui succède à Log4j 1.x et offre des améliorations significatives par rapport à Logback en termes de performances, notamment grâce à des architectures asynchrones sans verrouillage.
Log4j2 se distingue par sa haute performance et sa flexibilité, offrant une configuration plus simple et plus dynamique. L'intégration de Log4j2 dans une application Spring Boot est un processus relativement simple, impliquant la gestion des dépendances et la mise en place d'un fichier de configuration.
Configuration des Dépendances Maven
Pour remplacer le système de logging par défaut de Spring Boot (qui utilise Logback via spring-boot-starter-logging) par Log4j2, il est nécessaire d'exclure la dépendance par défaut et d'ajouter le starter Log4j2. Voici comment procéder dans votre fichier pom.xml :
<dependencies>
<!-- Dépendance web standard de Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Exclusion du starter de logging par défaut (Logback) -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Ajout de la dépendance Spring Boot Starter pour Log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
Fichier de Configuration Log4j2 (log4j2.xml)
Après avoir ajusté les dépendances, le cœur de la configuration de Log4j2 réside dans le fichier log4j2.xml, que vous placerez généralement dans le répertoire src/main/resources. Ce fichier définit les appenders (destinations des logs) et les loggers (catégories de logs et leurs niveaux).
<?xml version="1.0" encoding="UTF-8"?>
<!-- La configuration de Log4j2. 'status' permet de configurer le niveau de verbosité interne de Log4j2. -->
<!-- 'monitorInterval' indique la fréquence de vérification des modifications du fichier de configuration. -->
<Configuration status="WARN" monitorInterval="30">
<!-- Définition de propriétés personnalisées, utilisables via ${propertyName} -->
<Properties>
<Property name="CHEMIN_LOGS">./logs-application</Property>
<Property name="MODELE_DATE_COURT">%d{yyyy-MM-dd HH:mm:ss.SSS}</Property>
<Property name="MODELE_DEFAUT">${MODELE_DATE_COURT} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<!-- Appenders : définissent où et comment les messages de log sont écrits. -->
<Appenders>
<!-- Appender pour la console -->
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<!-- Filtre pour n'afficher que les logs de niveau DEBUG ou supérieur sur la console -->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- Layout du pattern pour la console -->
<PatternLayout pattern="${MODELE_DEFAUT}"/>
</Console>
<!-- Appender pour un fichier de log statique -->
<File name="FichierGlobal" fileName="${CHEMIN_LOGS}/application.log" append="true">
<PatternLayout pattern="${MODELE_DEFAUT}"/>
</File>
<!-- Appender RollingFile pour les logs de niveau DEBUG, avec rotation par taille et temps -->
<RollingFile name="FichierDebug" fileName="${CHEMIN_LOGS}/debug/debug.log"
filePattern="${CHEMIN_LOGS}/archives/debug-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${MODELE_DEFAUT}"/>
<Policies>
<!-- Rotation basée sur le temps (toutes les minutes) -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- Rotation basée sur la taille (quand le fichier atteint 100 Mo) -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- Stratégie de renommage : conserve au maximum 20 fichiers archivés -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<!-- Appender RollingFile pour les logs de niveau INFO -->
<RollingFile name="FichierInfo" fileName="${CHEMIN_LOGS}/info/info.log"
filePattern="${CHEMIN_LOGS}/archives/info-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${MODELE_DEFAUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<!-- Appender RollingFile pour les logs de niveau ERROR -->
<RollingFile name="FichierErreur" fileName="${CHEMIN_LOGS}/error/error.log"
filePattern="${CHEMIN_LOGS}/archives/error-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${MODELE_DEFAUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<!-- Loggers : définissent les messages qui seront envoyés aux appenders -->
<Loggers>
<!-- Configuration du logger racine, appliqué par défaut à toute l'application -->
<!-- Tous les messages de niveau INFO ou supérieur seront traités par les appenders référencés -->
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FichierGlobal"/>
<AppenderRef ref="FichierDebug"/>
<AppenderRef ref="FichierInfo"/>
<AppenderRef ref="FichierErreur"/>
</Root>
<!-- Loggers spécifiques pour réduire la verbosité de certains packages -->
<!-- Par exemple, les packages de Spring et MyBatis sont souvent très verbeux au niveau DEBUG -->
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.mybatis" level="INFO"/>
<!-- Supprimer les logs inutiles ou trop verbeux de bibliothèques tierces -->
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
<Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
</Loggers>
</Configuration>
Lien de la Configuration dans Spring Boot
Pour que Spring Boot utilise votre fichier log4j2.xml, vous devez le spécifier dans votre fichier de configuration application.yml (ou application.properties) :
logging:
config: classpath:log4j2.xml