Création d'un appender Log4j2 personnalisé

1. Introduction

Dans ce didacticiel, nous allons apprendre à créer un appender Log4j2 personnalisé. Si vous recherchez une introduction à Log4j2, veuillez consulter cet article.

Log4j2 est livré avec de nombreux appenders intégrés qui peuvent être utilisés à des fins diverses telles que la connexion à un fichier, à une base de données, à une socket ou à une base de données NoSQL.

Cependant, un appender personnalisé pourrait être nécessaire en fonction des demandes de l'application.

Log4j2 est une version mise à niveau de Log4j et a 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. Configuration de Maven

Nous aurons besoin de la dépendance log4j-core dans notre pom.xml pour commencer:

 org.apache.logging.log4j log4j-core 2.11.0 

La dernière version de log4j-core peut être trouvée ici.

3. Appender personnalisé

Nous pouvons implémenter notre appender personnalisé de deux manières. La première consiste à implémenter l' interface Appender et la seconde à étendre la classe AbstractAppender . 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 un MapAppender . Nous capturerons les événements du journal et les stockerons dans un HashMap simultané avec l'horodatage de la clé.

Voici comment nous créons le MapAppender:

@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.

Le nom du plugin signifie le nom que nous fournirions dans la configuration pour utiliser cet appender. La catégorie spécifie la catégorie sous laquelle nous plaçons le plugin. L' élémentType est appender.

Nous avons également besoin d'une méthode d'usine qui créera l'appender. Notre méthode createAppender sert cet objectif et est annotée avec l' annotation @PluginFactory .

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

Ensuite, nous avons remplacé la méthode append qui a la logique réelle de gestion du LogEvent . Dans notre cas, la méthode append place le LogEvent dans notre eventMap.

4. Configuration

Maintenant que nous avons notre MapAppender en place, nous avons besoin d'un fichier de configuration lo4j2.xml pour utiliser cet appender pour notre journalisation.

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

Notez que l'attribut packages doit faire référence au package qui contient 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 réellement l'appender dans notre section Loggers. Pour notre implémentation, nous utilisons MapAppender comme enregistreur racine et le définissons dans la section racine.

Voici comment procéder:

5. Gestion des erreurs

Pour gérer les erreurs lors de la journalisation de l'événement, nous pouvons utiliser la méthode d' erreur héritée de AbstractAppender.

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

Nous pouvons utiliser la méthode d' erreur de AbstractAppender pour enregistrer un message d'erreur. Voici comment cela se fait 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éthode d' ajout a changé maintenant. Nous vérifions que le niveau de l' événement est supérieur à WARN et nous revenons 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é sur Github.