Intro to Log4j2 - Annexes, présentations et filtres

Introduction à Log4j2 - Annexes, dispositions et filtres

1. Vue d'ensemble

La journalisation des événements est un aspect critique du développement logiciel. Bien que de nombreux frameworks soient disponibles dans l'écosystème Java, Log4J est le plus populaire depuis des décennies, en raison de sa flexibilité et de sa simplicité.

Log4j 2 est une nouvelle version améliorée du framework Log4j classique.

Dans cet article, nous présenterons les ajouts, mises en page et filtres les plus courants via des exemples pratiques.

Dans Log4J2, un appender est simplement une destination pour les événements de journal. cela peut être aussi simple qu'une console et complexe comme un SGBDR. Les mises en page déterminent la présentation des journaux et les filtres filtrent les données en fonction des différents critères.

2. Installer

Afin de comprendre plusieurs composants de journalisation et leur configuration, configurons différents cas d’utilisation de test, chacun consistant en un fichier de configurationlog4J2.xml et une classe de testJUnit 4.

Deux dépendances Maven sont communes à tous les exemples:


    org.apache.logging.log4j
    log4j-core
    2.7


    org.apache.logging.log4j
    log4j-core
    2.7
    test-jar
    test

Outre le paquet principallog4j-core, nous devons inclure le «jar de test» appartenant au paquet pour accéder à une règle de contexte nécessaire pour tester des fichiers de configuration aux noms inhabituels.

3. Configuration par défaut

ConsoleAppender est la configuration par défaut du package principal deLog4J 2. Il enregistre les messages sur la console système selon un modèle simple:



    
        
            
        
    
    
        
            
        
    

Analysons les balises dans cette configuration XML simple:

  • Configuration: L'élément racine d'un fichier de configurationLog4J 2 et de l'attributstatus est le niveau des événements Log4J internes que nous voulons consigner

  • Appenders: Cet élément contient un ou plusieurs appenders. Ici, nous allons configurer un appender qui sort vers la console système à la sortie standard

  • Loggers: Cet élément peut être composé de plusieurs élémentsLogger configurés. Avec la balise spécialeRoot, vous pouvez configurer un enregistreur standard sans nom qui recevra tous les messages de journal de l'application. Chaque enregistreur peut être défini sur un niveau de journalisation minimum

  • AppenderRef: Cet élément définit une référence à un élément de la sectionAppenders. Par conséquent, l’attribut «ref» est lié à l’attribut «name» des appenders

Le test unitaire correspondant sera également simple. Nous allons obtenir une référenceLogger et imprimer deux messages:

@Test
public void givenLoggerWithDefaultConfig_whenLogToConsole_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger(getClass());
    Exception e = new RuntimeException("This is only a test!");

    logger.info("This is a simple message at INFO level. " +
      "It will be hidden.");
    logger.error("This is a simple message at ERROR level. " +
    "This is the minimum visible level.", e);
}

4. ConsoleAppender avecPatternLayout

Définissons un nouvel ajout de console avec un modèle de couleur personnalisé dans un fichier XML séparé, et incluons-le dans notre configuration principale:



    

Ce fichier utilise des variables de modèle qui sont remplacées parLog4J 2 à l'exécution:

  • %style\{…}{colorname}: Ceci imprimera le texte de la première paire de crochets () dans une couleur donnée (colorname).

  • %highlight\{…}\{FATAL=colorname, …}: Ceci est similaire à la variable «style». Mais une couleur différente peut être donnée pour chaque niveau de log.

  • %date{format}: Ceci est remplacé par la date actuelle dans leformat spécifié. Ici, nous utilisons le format DateHeure «DEFAULT»,yyyy_-MM-jj HH: mm: ss, SSS'_.

  • %-5level: Imprime le niveau du message de journal dans l'alignement à droite.

  • %message: Représente le message du journal brut

Mais il existe beaucoup plus de variables et de formatage dans lesPatternLayout.. Vous pouvez les renvoyer à la documentation officielle deLog4J 2.

Nous allons maintenant inclure l'appender de console défini dans notre configuration principale:



    
        
    
    
        
            
        
    

Le test unitaire:

@Test
public void givenLoggerWithConsoleConfig_whenLogToConsoleInColors_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger("CONSOLE_PATTERN_APPENDER_MARKER");
    logger.trace("This is a colored message at TRACE level.");
    ...
}

5. Async File Appender avecJSONLayout etBurstFilter

Parfois, il est utile d’écrire des messages de journal de manière asynchrone. Par exemple, si les performances de l'application sont prioritaires sur la disponibilité des journaux.

Dans de tels cas d'utilisation, nous pouvons utiliser unAsyncAppender.

Pour notre exemple, nous configurons un fichier journal asynchroneJSON. En outre, nous allons inclure un filtre en rafale qui limite la sortie du journal à un taux spécifié:



    
        ...
        
            
            
        
        
            
        
    
    
        ...
        
            
        
        
            
        
    

Remarquerez que:

  • LeJSONLayout est configuré d'une manière qui écrit un événement de journal par ligne

  • LesBurstFilter abandonneront tous les événements avec le niveau 'INFO' et plus s'il y en a plus de deux, mais à un maximum de 10 événements abandonnés

  • LeAsyncAppender est défini sur un tampon de 80 messages de journal; après cela, le tampon est vidé dans le fichier journal

Jetons un coup d'œil au test unitaire correspondant. Nous remplissons le tampon ajouté dans une boucle, laissons l'écriture sur le disque et inspectons le nombre de lignes du fichier journal:

@Test
public void givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger("ASYNC_JSON_FILE_APPENDER");

    final int count = 88;
    for (int i = 0; i < count; i++) {
        logger.info("This is async JSON message #{} at INFO level.", count);
    }

    long logEventsCount
      = Files.lines(Paths.get("target/logfile.json")).count();
    assertTrue(logEventsCount > 0 && logEventsCount <= count);
}

6. RollingFile Appender etXMLLayout

Ensuite, nous allons créer un fichier journal évolutif. Une fois la taille du fichier configurée, le fichier journal est compressé et pivoté.

Cette fois, nous utilisons une mise en pageXML:



    
        
            
            
                
            
        
    
    
        
            
        
        
            
        
    

Remarquerez que:

  • L'appendeurRollingFile a un attribut «filePattern», qui est utilisé pour nommer les fichiers journaux tournés et peut être configuré avec des variables d'espace réservé. Dans notre exemple, il devrait contenir une date et un compteur avant le suffixe du fichier.

  • La configuration par défaut deXMLLayout écrira des objets d'événement de journal unique sans l'élément racine.

  • Nous utilisons une politique basée sur la taille pour la rotation de nos fichiers journaux.

Notre classe de tests unitaires ressemblera à celle de la section précédente:

@Test
public void givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger("XML_ROLLING_FILE_APPENDER");
    final int count = 88;
    for (int i = 0; i < count; i++) {
        logger.info(
          "This is rolling file XML message #{} at INFO level.", i);
    }
}

7. Syslog Appender

Supposons que nous devions envoyer les événements journalisés à une machine distante sur le réseau. Le moyen le plus simple de faire cela en utilisant Log4J2 serait de l’utiliserSyslog Appender:



    
        ...
        
        
    
    
        ...
        
            
        
        
            
        
    

Les attributs de la baliseSyslog:

  • name: définit le nom de l'appendeur et doit être unique. Puisque nous pouvons avoir plusieurs appender Syslog pour la même application et configuration

  • format: il peut être défini sur BSD ou RFC5424, et les enregistrements Syslog seraient formatés en conséquence

  • host & port: le nom d'hôte et le port de la machine serveur Syslog distante

  • protocol: s'il faut utiliser TCP ou UPD

  • facility: dans quelle fonction Syslog l'événement sera écrit

  • connectTimeoutMillis: période d'attente pour une connexion établie, par défaut à zéro

  • reconnectionDelayMillis: délai d'attente avant de réessayer la connexion

8. FailoverAppender

Il peut arriver que l'un des appenderes ne traite pas les événements du journal et que nous ne voulions pas perdre les données. Dans de tels cas, lesFailoverAppender sont utiles.

Par exemple, si l'appenderSyslog ne parvient pas à envoyer les événements à la machine distante, au lieu de perdre ces données, nous pourrions revenir temporairement àFileAppender.

LeFailoverAppender prend un appender principal et le nombre d'appenders secondaires. En cas d'échec du primaire, il essaie de traiter l'événement du journal avec des événements secondaires dans l'ordre jusqu'à ce que l'un d'eux réussisse ou qu'il n'y ait pas de secondaires à essayer:


    
        
    

Testons-le:

@Test
public void givenLoggerWithFailoverConfig_whenLog_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger("FAIL_OVER_SYSLOG_APPENDER");
    Exception e = new RuntimeException("This is only a test!");

    logger.trace("This is a syslog message at TRACE level.");
    logger.debug("This is a syslog message at DEBUG level.");
    logger.info("This is a syslog message at INFO level.
      This is the minimum visible level.");
    logger.warn("This is a syslog message at WARN level.");
    logger.error("This is a syslog message at ERROR level.", e);
    logger.fatal("This is a syslog message at FATAL level.");
}

9. Appender JDBC

L'appender JDBC envoie les événements de journal à un SGBDR, à l'aide de JDBC standard. La connexion peut être obtenue à l’aide d’une source de données JNDI ou d’une fabrique de connexions.

La configuration de base se compose deDataSource ouConnectionFactory, ColumnConfigs ettableName:


    
    
    
    
    
    

Essayons maintenant:

@Test
public void givenLoggerWithJdbcConfig_whenLogToDataSource_thanOK()
  throws Exception {
    Logger logger = LogManager.getLogger("JDBC_APPENDER");
    final int count = 88;
    for (int i = 0; i < count; i++) {
        logger.info("This is JDBC message #{} at INFO level.", count);
    }

    Connection connection = ConnectionFactory.getConnection();
    ResultSet resultSet = connection.createStatement()
      .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs");
    int logCount = 0;
    if (resultSet.next()) {
        logCount = resultSet.getInt("ROW_COUNT");
    }
    assertTrue(logCount == count);
}

10. Conclusion

Cet article présente des exemples très simples montrant comment vous pouvez utiliser différents appendeurs de journalisation, filtres et présentations avec Log4J2, ainsi que des méthodes pour les configurer.

Les exemples qui accompagnent l'article sont disponiblesover on GitHub.