Introduction
Lorsqu’on développe une application, elle a vocation à être déployée sur un environnement de production. Vous aurez alors besoin de surveiller le bon fonctionnement de cette application avec une journalisation.
Il s’agit d’enregistrer les évènements de votre application dans un fichier, communément appelé log. Ces derniers vous serons aussi utiles pendant votre phase de développement et de recette pour détecter les anomalies fonctionnelles et techniques.
Les logs sont une composante essentielle à toutes les applications, c’est pourquoi des frameworks ont été développés afin de faciliter la gestion des niveaux d’informations, l’intégration dans l’application et le format en sortie.
Comparaison
Avec ASP .NET Core, Microsoft propose sa propre interface pour .NET Core : Microsoft.Extensions.Logging.
Il existe plusieurs librairies qui utilisent cette interface pour fonctionner avec .NET Core : Log4net, Nlog et Serilog.
Log4net est un framework datant de 2001 qui a pris un peu de temps pour porter son code sur .NET Core.
Il s’agit d’un portage de Log4j maintenu par la fondation Apache avec une configuration dans une fichier XML.
Nlog est un projet actif et populaire qui date de 2006. Les dernières versions de Nlog supportent les logs structurés.
La structuration des logs en XML ou JSON permet de faciliter la recherche et l’analyse des logs avec des outils externes.
Serilog un framework récent qui supporte aussi les logs structurés. Officialisé en 2013, il s’est rapidement imposé au sein de la communauté .NET grâce à la simplicité de sa configuration et ses très nombreuses solutions de sorties.
Pour ce tutoriel, nous avons choisis d’utiliser Serilog dans notre application ASP .NET Core, car c’est un framework modulaire activement développé avec une intégration efficace et rapide.
Installation
On va créer une nouvelle solution ASP .NET Core dans Visual Studio :
On ajoute le paquet Nuget « Serilog.ASPNetCore » qui contient toutes les dépendances nécessaires pour utiliser Serilog avec ASP .NET Core.
Ouvrez le fichier Program.cs à la racine du projet et ajoutez un bloc « try/catch » dans la méthode « Main » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("C:\\Workspace\\Logs\\blog-.log", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 500000, rollOnFileSizeLimit: true, shared: true, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}") .CreateLogger(); try { Log.Information("Starting web host"); CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly"); } finally { Log.CloseAndFlush(); } } |
Ajouter aussi Serilog dans « CreateHostBuilder » :
Retirer AddLogging() de « CreateHostBuilder » s’il présent, car il n’est pas nécessaire. Dans le fichier de configuration « appsettings.json », vous pouvez également retirer la section « Logging » qui n’est plus nécessaire aussi.
Si vous le souhaitez, vous pouvez modifier la méthode « Configure » dans le fichier « Startup.cs » en ajoutant la ligne « app.UseSerilogRequestLogging(); » pour l’enregistrement des évènements HTTP.
Ecriture des logs
Ouvrir le fichier « HomeController.cs » et ajouter la propriété privée « _logger » en lecture seule et un paramètre dans constructeur pour l’utiliser via une injection de dépendance. Ajoutez ensuite un log dans la méthode « Index » pour tester que Serilog fonctionne bien.
Lancez l’application et vérifiez si le fichier a bien été créé dans le répertoire « C:\Workspace\Logs ».
Format de sortie
Le volume de logs à traiter est parfois conséquent, vous pouvez utiliser une solution comme Azure Monitor ou Kibana pour visualiser plus rapidement les évènements de votre application.
La force de Serilog, ce sont ses extensions qui sont vraiment pratiques, on a un large choix et l’intégration est vraiment rapide.
On intègre par exemple Sentry qui est un traqueur d’anomalie en production. Dans un premier temps, ajouter le paquet Nuget « Serilog.Sinks.Sentry » au projet, puis il suffit d’ajouter la ligne « WriteTo.Sentry(« Sentry DSN ») dans l’initialisation du logger.
Dans l’image ci-dessus, « Sentry DSN » corresponds à un identifiant que vous obtenez en créant un compte sur le site de Sentry.
Fichier de configuration
Il est aussi possible de configurer Serilog dans le fichier de configuration « appsettings.json » avec une balise « Serilog » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ "Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console", "Args": { "outputTemplate": "===> {Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}" } }, { "Name": "File", "Args": { "path": "C:\\Workspace\\Logs\\blog-.txt", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}", "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact", "rollingInterval": "Day" } } ], "Properties": { "Application": "Blog" } }, "AllowedHosts": "*" } |
Modifiez la propriété du fichier « appsettings.json » pour qu’il soit bien copié dans le dossier de sortie de l’application.
Ouvrez votre fichier Program.cs et appliquez les modifications ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static void Main(string[] args) { var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); try { Log.Information("Starting web host"); CreateWebHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly"); } finally { Log.CloseAndFlush(); } } |
Conclusion
Les configurations utilisées dans ce tutoriel ne sont pas exhaustives, il existe bien d’autres options pour gérer les environnements, les enregistrements asynchrones et les bases de données par exemple.
L’intégration de Serilog avec ASP .NET Core présentée ici est un démarrage rapide avec ce framework de journalisation moderne.
N’hésitez pas à partager en commentaire si cet article vous a été utile ou si vous avez rencontrez une problème.
Sources:
https://github.com/serilog/serilog-aspnetcore
https://docs.microsoft.com/fr-fr/aspnet/core/fundamentals/logging/