Connexion au démarrage du printemps

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.

Read more

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.

Read more

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:

image

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:

 

image

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:

 

image

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.

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