Connexion au démarrage du printemps
1. Vue d'ensemble
Dans ce court didacticiel, nous allons explorer les principales options de journalisation disponibles dans Spring Boot.
Des informations plus détaillées sur Logback sont disponibles dansA Guide To Logback, tandis que Log4j2 est introduit dansIntro to Log4j2 – Appenders, Layouts and Filters.
Lectures complémentaires:
Définition du niveau de journalisation lors du démarrage printanier lors du test
Lorsque vous avez besoin de diagnostiquer des échecs de test en examinant une sortie de journal plus détaillée, voici comment reconfigurer la journalisation dans les applications Spring au moment du test.
Afficher le rapport de configuration automatique au démarrage du printemps
Découvrez quels beans sont automatiquement configurés dans votre application Spring Boot en générant un rapport de configuration automatique au démarrage.
2. La configuration initiale
Commençons par créer un module Spring Boot - la manière recommandée de le faire est d'utiliserSpring Initializr, que nous couvrons dans nosSpring Boot Tutorial.
Créons maintenant notre seul fichier de classe,LoggingController:
@RestController
public class LoggingController {
Logger logger = LoggerFactory.getLogger(LoggingController.class);
@RequestMapping("/")
public String index() {
logger.trace("A TRACE Message");
logger.debug("A DEBUG Message");
logger.info("An INFO Message");
logger.warn("A WARN Message");
logger.error("An ERROR Message");
return "Howdy! Check out the Logs to see the output...";
}
}
Une fois que nous avons chargé l'application Web,we’ll be able to trigger those logging lines by simply visiting http://localhost:8080/
3. Enregistrement de configuration zéro
Spring Boot est un cadre très utile car il nous permet d’oublier la plupart des paramètres de configuration, dont beaucoup sont, à notre avis, autotunes.
Dans le cas de la journalisation, la seule dépendance obligatoire estApache Commons Logging.
Nous devons l'importer uniquement lors de l'utilisation de Spring 4.x (Spring Boot 1.x), car dans Spring 5 (Spring Boot 2.x), il est fourni par le modulespring-jcl de Spring Framework.
We shouldn’t worry about importing spring-jcl at all if we’re using a Spring Boot Starter (ce que nous sommes presque toujours). C'est parce que chaque démarreur, comme nosspring-boot-starter-web, dépend despring-boot-starter-logging, qui tire déjàspring-jcl pour nous.
When using starters, Logback is used for logging by default.
Spring Boot la préconfigure avec des motifs et des couleurs ANSI pour rendre la sortie standard plus lisible.
Exécutons maintenant l'application, visitons la pagehttp://localhost:8080/ et voyons ce qui se passe dans la console:
Comme nous pouvons le voir dans l'image ci-dessus,the default logging level of the Logger is preset to INFO, meaning thatTRACE and DEBUG messages are not visible.
Afin de les activer sans modifier la configuration,we can pass the –debug or –trace arguments on the command line:
java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace
Spring Boot aussigives us access to a more fine-grained log level setting via environment variables. Nous pouvons y arriver de plusieurs façons.
Premièrement, nous pouvons définir notre niveau de journalisation dans nos options de VM:
-Dlogging.level.org.springframework=TRACE
-Dlogging.level.com.example=TRACE
Sinon, si nous utilisons Maven, nous pouvonsdefine our log settings via the command line:
mvn spring-boot:run
-Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.example=TRACE
Lorsque vous travaillez avec Gradle, nous pouvons transmettre les paramètres du journal via la ligne de commande. Cela nécessiterasetting the bootRun task. Une fois cela fait, nous pouvons exécuter l'application:
./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.example=TRACE
Si nous voulons changer la verbosité de façon permanente, nous pouvons le faire dans le fichierapplication.properties comme décrithere:
logging.level.root=WARN
logging.level.com.example=TRACE
Enfin, nous pouvonschange the logging level permanently by using our logging framework configuration file.
Nous avons mentionné précédemment que Logback est utilisé par défaut dans Spring Boot Starter. Voyons comment définir un fragment d'un fichier de configuration Logback dans lequel nous définissons le niveau de deux packages distincts:
Il est intéressant de noter queif the log level for a package is defined multiple times utilise les différentes options mentionnées ci-dessus, maiswith different log levels, the lowest level will be used.
Donc, compte tenu de nos exemples ci-dessus, si nous définissons les niveaux de journalisation à l'aide de Logback, Spring Boot et des variables d'environnement en même temps, le niveau de journalisation seraTRACE, car il est le plus bas parmi les niveaux demandés.
4. Journalisation de la configuration de la connexion
Même si la configuration par défaut est utile (par exemple pour démarrer en un rien de temps pendant les POC ou les expériences rapides), elle ne suffit probablement pas à nos besoins quotidiens.
Voyonshow to include a Logback configuration avec une couleur et un modèle de journalisation différents, avec des spécifications séparées pour la sortie deconsole etfile, et avec unrolling policy décent pour éviter de générer d'énormes fichiers journaux.
Tout d'abord, nous devrions aller vers une solution qui permet de gérer nos paramètres de journalisation seuls, au lieu de polluerapplication.properties, qui est couramment utilisé pour de nombreux autres paramètres d'application.
When a file in the classpath has one of the following names, Spring Boot will automatically load it sur la configuration par défaut:
-
logback-spring.xml
-
logback.xml
-
logback-spring.groovy
-
logback.groovy
Spring recommends using the -spring variant sur les simples chaque fois que possible, comme décrithere.
Écrivons un simplelogback-spring.xml:
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
${LOGS}/spring-boot-logger.log
%d %p %C{1.} [%t] %m%n
${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
10MB
Et lorsque nous exécutons l'application, voici le résultat:
Comme nous pouvons le voir, il enregistre maintenant les messagesTRACE etDEBUG, et le modèle global de la console est à la fois textuellement et chromatiquement différent qu'avant.
Il enregistre également maintenant un fichier dans un dossier/logs créé sous le chemin actuel et l'archive via une politique de roulement.
5. Journalisation de la configuration Log4j2
Alors que Apache Commons Logging est au cœur et Logback est l'implémentation de référence fournie, tous les routages vers les autres bibliothèques de journalisation sont déjà inclus pour faciliter leur basculement.
In order to use any logging library other than Logback, though, we need to exclude it from our dependencies.
Pour chaque démarreur comme celui-ci (c'est le seul dans notre exemple, mais nous pourrions en avoir plusieurs):
org.springframework.boot
spring-boot-starter-web
nous devons en faire une version maigre, et (une seule fois) ajouter notre bibliothèque alternative, ici à travers un démarreur lui-même:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
À ce stade, nous devons placer dans le chemin de classe un fichier portant le nom suivant:
-
log4j2-spring.xml
-
log4j2.xml
Nous imprimerons via Log4j2 (sur SLF4J) sans autres modifications.
Écrivons un simplelog4j2-spring.xml:
%d %p %C{1.} [%t] %m%n
Et lorsque nous exécutons l'application, voici le résultat:
Comme nous pouvons le voir, la sortie est assez différente de celle de Logback - une preuve que nous utilisons pleinement Log4j2 maintenant.
En plus de la configuration XML, Log4j2 nous permet d'utiliser également une configuration YAML ou JSON, comme décrithere.
6. Log4j2 sans SLF4J
Nous pouvons également utiliser Log4j2 de manière native, sans passer par SLF4J.
Pour ce faire, nous devons simplement utiliser les classes natives:
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
// [...]
Logger logger = LogManager.getLogger(LoggingController.class);
Nous n'avons pas besoin d'effectuer d'autres modifications de la configuration standard de Log4j2 Spring Boot.
Nous pouvons désormais exploiter les toutes nouvelles fonctionnalités de Log4j2 sans être coincés avec l'ancienne interface SLF4J, mais nous sommes également liés à cette implémentation, et nous devrons réécrire notre code lorsque nous déciderons de passer à un autre cadre de journalisation.
7. Enregistrement avec Lombok
Dans les exemples, nous avons vuso far, we’ve had to declare an instance of a logger de notre structure de journalisation. Ce code standard peut être gênant et nous pouvons l'éviter en utilisant diverses annotations introduites par Lombok.
Nous devrons d'abord ajouter la dépendance Lombok dans notre script de construction pour l'utiliser:
org.projectlombok
lombok
1.18.4
provided
7.1. @Slf4j et@CommonsLog
Les API de journalisation SLF4J et Apache Commons nous permettent de modifier notre infrastructure de journalisation sans impact sur notre code.
Et nous pouvonsuse Lombok’s @Slf4j and @CommonsLog annotations pour ajouter la bonne instance de journalisation dans notre classe:org.slf4j.Logger pour SLF4J etorg.apache.commons.logging.Log pour Apache Commons Logging.
Pour voir ces annotations en action, créons une classe similaire àLoggingController mais sans instance de journalisation. Nous le nommonsLombokLoggingController et l'annotons avec@Slf4j:
@RestController
@Slf4j
public class LombokLoggingController {
@RequestMapping("/lombok")
public String index() {
log.trace("A TRACE Message");
log.debug("A DEBUG Message");
log.info("An INFO Message");
log.warn("A WARN Message");
log.error("An ERROR Message");
return "Howdy! Check out the Logs to see the output...";
}
}
Notez que nous avons légèrement ajusté l'extrait de code, en utilisantlog comme instance de journalisation. En effet, l'ajout de l'annotation@Slf4j ajoute automatiquement un champ nommélog.
AvecZero-Configuration Logging,the application will use underlying logging implementation Logback pour la journalisation. De même, l'implémentation de Log4j2 sera utilisée pour la journalisation avec Log4j2-Configuration Logging.
On obtient le même comportement quand on remplace l'annotation@Slf4j par@CommonsLog.
7.2. @Log4j2
Nous pouvons utiliser l'annotation@Log4j2 pour utiliser directement Log4j2. Par conséquent, nous modifions simplementLombokLoggingController pour utiliser@Log4j2 au lieu de@Slf4j ou@CommonsLog:
@RestController
@Log4j2
public class LombokLoggingController {
@RequestMapping("/lombok")
public String index() {
log.trace("A TRACE Message");
log.debug("A DEBUG Message");
log.info("An INFO Message");
log.warn("A WARN Message");
log.error("An ERROR Message");
return "Howdy! Check out the Logs to see the output...";
}
}
Outre la journalisation, il existe d'autres annotations de Lombok qui aident à garder notre code propre et bien rangé. Plus d'informations à leur sujet sont disponibles dansIntroduction to Project Lombok, et nous avons également un tutoriel surSetting up Lombok with Eclipse and IntelliJ.
8. Méfiez-vous de la journalisation Java Util
Spring Boot prend également en charge la journalisation JDK, via le fichier de configurationlogging.properties.
Cependant, il y a des cas où ce n'est pas une bonne idée de l'utiliser. À partir dethe documentation:
Il existe des problèmes de chargement de classes avec Java Util Logging qui entraînent des problèmes lors de l’exécution à partir d’un ‘jar exécutable '. Nous vous recommandons de l’éviter lors de l’exécution à partir d’un ‘jar exécutable 'dans la mesure du possible.
Lors de l'utilisation de Spring 4, il est également recommandé d'exclure manuellementcommons-logging dans pom.xml, pour éviter les conflits potentiels entre les bibliothèques de journalisation. Spring 5 le gère automatiquement, nous n'avons donc rien à faire lors de l'utilisation de Spring Boot 2.
9. JANSI sous Windows
Alors que les systèmes d'exploitation Unix tels que Linux et Mac OS X prennent en charge les codes de couleur ANSI par défaut, sur une console Windows, tout sera tristement monochromatique.
Windows peut obtenir des couleurs ANSI via une bibliothèque appelée JANSI.
Nous devons cependant faire attention aux éventuels inconvénients du chargement de classe.
Nous devons l'importer et l'activer explicitement dans la configuration comme suit:
true
[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
Les séquences d'échappement ANSI sont prises en charge de manière native sur de nombreuses plates-formes, mais ne le sont pas par défaut sous Windows. To enable ANSI support add the Jansi jar to our application and set property log4j.skipJansi to false. Cela permet à Log4j d'utiliser Jansi pour ajouter des codes d'échappement ANSI lors de l'écriture sur la console.
NoteAvant Log4j 2.10, Jansi était activé par défaut. Le fait que Jansi nécessite du code natif signifie queJansi can only be loaded by a single class loader. Pour les applications Web, cela signifiethe Jansi jar has to be in the web container’s classpath. Pour éviter de causer des problèmes aux applications Web, Log4j n'essaiera plus de charger automatiquement Jansi sans configuration explicite à partir de Log4j 2.10.
Il est également intéressant de savoir que:
-
la page de documentation delayout contient des informations JANSI Log4j2 utiles dans la sectionhighlight{pattern}{style}
-
tandis que JANSI peut colorer la sortie, la bannière de Spring Boot (native ou personnalisée via le fichierbanner.txt) restera monochromatique
10. Conclusion
Nous avons vu les principales façons d'interagir avec les principaux frameworks de journalisation à partir d'un projet Spring Boot.
Nous avons également exploré les principaux avantages et pièges de chaque solution.
Comme toujours, le code source complet est disponibleover on Github.