ASP .NET Core MVC – Tracer des logs dans un fichier

Présentation
Enregistrer des traces lors du traitement des requêtes HTTP permet d’obtenir des informations sur le comportement de l’application Web, sur ses performances, et d’autres utiles pour le débogage de ses fonctionnalités.
Dans cet article, je vous propose d’utiliser le composant Serilog afin de créer des fichiers de logs.

Fonctionnement
Il existe différents niveaux de log (du plus insignifiant au plus critique) :

  • Verbose : texte quelconque
  • Debug : information de débogage
  • Information : information fonctionnelle
  • Warning : avertissement
  • Error : erreur
  • Fatal : erreur « mortelle » pour l’application

Dans l’application, les développeurs enregistrent des logs en fonction du niveau qu’ils leur attribuent. Puis, dans le code ou dans le fichier de configuration de l’application, un niveau minimum est défini et toutes les logs d’un niveau inférieur sont ignorées.
Dans cet article, ces logs vont être enregistrées dans un fichier qui contiendra la date à laquelle il a été généré. Le niveau de log minimum est Information. La gestion des fichiers de logs est effectuée de manière circulaire.

Configuration
Dans un projet ASP .NET Core MVC, installer les packages NuGet nommés Serilog.AspNetCore et Serilog.Sinks.RollingFile.
Le fichier de logs sera créé/ouvert lors du démarrage de l’application. Il sera libéré lorsque l’application s’arrêtera. Modifions la classe Program :

public class Program
{
    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .WriteTo.RollingFile(@"d:\AppTraces.txt", retainedFileCountLimit: 15)
            .CreateLogger();

        try
        {
            Log.Information("Démarrage du serveur Web");

            CreateWebHostBuilder(args).Build().Run();

            return 0;
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Le serveur Web s'est interrompu de manière inattendue");
            return 1;
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseSerilog();
}

Mise en œuvre
Par exemple, pour écrire une log de débogage :

public class HomeController : Controller
{
    public IActionResult Index()
    {
        Log.Logger.Information("Hello");

        return View();
    }
}

Résultat
2019-02-17 16:24:51.921 +01:00 [Information] Démarrage du serveur Web
2019-02-17 16:24:54.059 +01:00 [Information] User profile is available. Using ‘ »C:\Users\James\AppData\Local\ASP.NET\DataProtection-Keys »‘ as key repository and Windows DPAPI to encrypt keys at rest.
2019-02-17 16:24:54.693 +01:00 [Information] Request starting HTTP/2.0 GET https://localhost:44327/
2019-02-17 16:24:54.950 +01:00 [Information] Route matched with « {action = \ »Index\ », controller = \ »Home\ »} ». Executing action « TracerLogsFichier.Controllers.HomeController.Index (TracerLogsFichier) »
2019-02-17 16:24:54.962 +01:00 [Information] Executing action method « TracerLogsFichier.Controllers.HomeController.Index (TracerLogsFichier) » – Validation state: Valid
2019-02-17 16:24:54.963 +01:00 [Information] Hello
2019-02-17 16:24:54.967 +01:00 [Information] Executed action method « TracerLogsFichier.Controllers.HomeController.Index (TracerLogsFichier) », returned result « Microsoft.AspNetCore.Mvc.ViewResult » in 1.1574ms.
2019-02-17 16:24:54.998 +01:00 [Information] Executing ViewResult, running view « Index ».
2019-02-17 16:24:55.066 +01:00 [Information] Executed ViewResult – view « Index » executed in 88.552ms.
2019-02-17 16:24:55.067 +01:00 [Information] Executed action « TracerLogsFichier.Controllers.HomeController.Index (TracerLogsFichier) » in 116.6456ms
2019-02-17 16:24:55.074 +01:00 [Information] Request finished in 382.5369ms 200 text/html; charset=utf-8

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.