[Logs] Ecrire son propre appender Log4Net pour loguer dans MongoDB 5/8

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le mardi 24 mai 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Nous allons désormais voir dans ce billet comment créer son propre appender pour Log4Net, à travers un exemple où nous loguerons dans MongoDB.

Pour rappel, ce billet fait partie d’une série sur les logs que vous pouvez lire sur ces différents liens :

  1. Pourquoi avoir recours à des logs dans une application
  2. Utiliser Log4Net dans son application
  3. Ecrire un message de log utile
  4. Les appenders Log4Net
  5. Ecrire son propre appender Log4Net pour loguer dans MongoDB
  6. Centraliser les logs avec GrayLog
  7. Loguer dans GrayLog depuis une application Windows Phone
  8. Centralisation de logs avec ELK

 

Il est très facile d’écrire son propre appender et c’est pour ça qu’il y en a autant disponibles sur NuGet. Pourquoi écrire un appender pour écrire dans MongoDB ? Et bien pour la petite histoire, je travaillais sur un projet qui utilisait la dernière version du driver asynchrone de MongoDB et à cette époque aucun appender n’utilisait cette nouvelle version du driver, ce qui me posait des problèmes de compatibilité. C’est sans doute corrigé maintenant, je reconnais ne pas être allé voir…

Toujours est-il que ce petit travail me permet de montrer comment créer un appender pour Log4Net. Il suffit de créer une classe qui dérive de AppenderSkeleton et de substituer les méthodes Append qui reçoivent des LoggingEvent en paramètre.

Note : pour ne pas repartir de zéro, je me suis basé sur la bibliothèque open-source dispo ici (d'ailleurs, je viens d’aller voir, cette bibliothèque utilise désormais le driver asynchrone et fait encore plus de choses que mon exemple !)

La première chose à faire est de référence le driver C# pour MongoDB, un petit coup de NuGet et le tour est joué :

 

Note : ne pas prendre le mongocsharpdriver legacy.

Voici le code utile côté Log4Net :

Donc, on voit qu’on substitue deux méthodes Append, une qui prend un LoggingEvent et l’autre un tableau de LoggingEvent. Etant donné que le driver est asynchrone, et que l’appender est synchrone, ici j’utilise un Task.Run pour faire de la magie d’asynchronisme, mais ce n’est pas tant le sujet.

Ce qui nous intéresse c‘est que l’objet LoggingEvent contient plein d’informations au sujet du log et que nous allons pouvoir l’utiliser pour enregistrer ce qui nous intéresse. Nous allons voir ça plus bas à partir de la méthode BuildBsonDocument.

L’autre élément important c’est qu’il est possible de configurer l’appender, notamment pour lui fournir la chaine de connexion à MongoDB et d’autres choses. Pour ça, il n’y a rien de spécial à faire, il suffit juste d’exposer des propriétés publiques :

Et voici, comment je vais pouvoir déclarer mon appender et indiquer les éléments de configuration :

N’oubliez pas bien sûr de rajouter l’appender aux logger :

Il ne reste plus qu’à construire le Bson à partir des infos du LoggingEvent. Pour ça, rien d’extraordinaire, je vous laisse regarder le code de la classe :

Pour plus de précisions sur la manipulation du BsonDocument, vous pouvez consulter l’aide officielle.

Et voilà ce que je retrouve dans Robomongo après avoir exécuté mon petit programme (l’écriture étant asynchrone, j’ai rajouté un petit Thread.Sleep à la fin du programme pour lui laisser le temps de logguer correctement).

On retrouve la base de données Logs ainsi que la collection Logs :

Ouvrons un document au hasard pour en voir le contenu :

Facile non ?

Reste plus qu’à créer les index mongo adéquats pour faire vos recherches de logs…

Nous verrons dans le prochain billet, qu’il y a surement des meilleurs endroits où stocker ses logs, comme dans Graylog par exemple.