Créer un appender personnalisé Log4j2

Création d'un appender Log4j2 personnalisé

1. introduction

Dans ce didacticiel, nous allons découvrir comment créer un appender Log4j2 personnalisé. Si vous cherchez une introduction à Log4j2, veuillez jeter un œil àthis article.

Log4j2 ships with a lot of built-in appenders qui peut être utilisé à diverses fins telles que la connexion à un fichier, à une base de données, à une socket ou à une base de données NoSQL.

Cependant, il pourrait être nécessaire de créer un générateur d'appels personnalisé en fonction des demandes de l'application.

Log4j2 est une version mise à niveau de Log4j et présente des améliorations significatives par rapport à Log4j. Par conséquent, nous utiliserons le framework Log4j2 pour démontrer la création d'un appender personnalisé.

2. Maven Setup

Nous aurons besoin de la dépendancelog4j-core dans nospom.xml pour commencer:


    org.apache.logging.log4j
    log4j-core
    2.11.0

La dernière versionlog4j-core peut être trouvéehere.

3. Appender personnalisé

Nous pouvons implémenter notre appender personnalisé de deux manières. First is by implementing the Appender interface and the second is by extending the AbstractAppender class. La deuxième méthode fournit un moyen simple d'implémenter notre propre appender personnalisé et c'est ce que nous utiliserons.

Pour cet exemple, nous allons créer unMapAppender. Nous capturerons les événements du journal et les stockerons dans unConcurrentHashMap w avec l'horodatage de la clé.

Voici comment nous créons lesMapAppender:

@Plugin(
  name = "MapAppender",
  category = Core.CATEGORY_NAME,
  elementType = Appender.ELEMENT_TYPE)
public class MapAppender extends AbstractAppender {

    private ConcurrentMap eventMap = new ConcurrentHashMap<>();

    protected MapAppender(String name, Filter filter) {
        super(name, filter, null);
    }

    @PluginFactory
    public static MapAppender createAppender(
      @PluginAttribute("name") String name,
      @PluginElement("Filter") Filter filter) {
        return new MapAppender(name, filter);
    }

    @Override
    public void append(LogEvent event) {
        eventMap.put(Instant.now().toString(), event);
    }
}

Nous avons annoté la classe avec l'annotation@Plugin qui indique que notre appender est un plugin.

Lename du plugin signifie le nom que nous fournirions dans la configuration pour utiliser cet appender. Lecategory spécifie la catégorie sous laquelle nous plaçons le plugin. LeelementType est appender.

Nous avons également besoin d'une méthode de fabrication permettant de créer l'appender. Notre méthodecreateAppender sert cet objectif et est annotée avec l'annotation@PluginFactory.

Ici, nous initialisons notre appender en appelant le constructeur protégé et nous passons leslayout comme null car nous n'allons pas fournir de disposition dans le fichier de configuration et nous nous attendons à ce que le framework résolve la disposition par défaut.

Ensuite,we’ve overridden the append method which has the actual logic of handling the LogEvent. Dans notre cas, la méthodeappend met lesLogEvent dans noseventMap. 

4. Configuration

Maintenant que nous avons notre emplacementMapAppender in, nous avons besoin d'un fichier de configurationlo4j2.xml pour utiliser cet appender pour notre journalisation.

Voici comment nous définissons la section de configuration dans notre fichierlog4j2.xml:

Notez que l'attribut packages doit faire référence au package contenant votre appender personnalisé.

Ensuite, dans la section de notre appender, nous définissons l'appender. Voici comment nous ajoutons notre appender personnalisé à la liste des appenders dans la configuration:

La dernière partie consiste à utiliser l'appender dans notre section Loggers. Pour notre implémentation, nous utilisonsMapAppender comme enregistreur racine et le définissons dans la section racine.

Voici comment procéder:


    

5. La gestion des erreurs

Pour gérer les erreurs lors de la journalisation de l'événement, nous pouvons utiliser la méthodeerror héritée deAbstractAppender.

Par exemple, si nous ne voulons pas consigner les événements dont le niveau de journalisation est inférieur à celui deWARN.

Nous pouvons utiliser la méthodeerror deAbstractAppender pour enregistrer un message d'erreur. Voici comment cela se passe dans notre classe:

public void append(LogEvent event) {
    if (event.getLevel().isLessSpecificThan(Level.WARN)) {
        error("Unable to log less than WARN level.");
        return;
    }
    eventMap.put(Instant.now().toString(), event);
}

Observez comment notre méthodeappend a changé maintenant. Nous vérifions que le niveau deevent’s est supérieur àWARN et nous retournons tôt s'il est inférieur àWARN.

6. Conclusion

Dans cet article, nous avons vu comment implémenter un appender personnalisé pour Log4j2.

Bien qu'il existe de nombreuses façons intégrées de consigner nos données à l'aide des appenders fournis par Log4j2, nous avons également des outils dans ce cadre qui nous permettent de créer notre propre appender selon les besoins de notre application.

Comme d'habitude, l'exemple peut être trouvéover on Github.