Optimisez la gestion de vos logs .net Core avec Kibana, Elasticsearch et Serilog

Kibana est un puissant outil de visualisation permettant de filtrer et de visualiser les données stockées dans Elasicsearch. Il est particulièrement adapté à l'exploitation des logs applicatifs. Elasticsearch est un moteur d'indexation distribué basé sur Apache Lucene. Il fournit un moteur de recherche distribué via une API REST. Serilog est un framework de log .net distribué sous la forme d'un package Nugget. Il fournit un certain nombre de providers permettant de rediriger les logs dans un fichier, un mail, un moteur d'indexation, la sortie standard, etc...

Pré-requis

Configurer l'application pour rediriger les logs dans Elasticsearch

Cloner le projet .net core (web api)

_git clone https://github.com/uniteeio/dotnet-core-elasticsearch-kibana_

Lancer Elasticsearch et Kibana Placez-vous à la racine du projet et exécuter la commande suivante :

docker-compose up -d

Docker pull les images nécessaires et lance la stack. Pour accéder à Kibana : http://localhost:5601 Pour accéder à Elasticsearch : http://localhost:9200 Installer les paquets Nuggets nécessaires

Install-Package Serilog
Install-Package Serilog.Extensions.Logging
Install-Package Serilog.Sinks.Elasticsearch
Install-Package Serilog.Settings.Configuration

Modifier le fichier Startup.cs

  • Créez une instance configurée de Serilog
public Startup(IConfiguration configuration)
{
    Configuration = configuration;

    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(Configuration)
        .CreateLogger();
}
  • Déclarez le service Serilog dans le conteneur de services
public void ConfigureServices(IServiceCollection services)
{
    // Serilog
    services.AddLogging(
        loggingBuilder => loggingBuilder.AddSerilog(dispose: true)
    );

    services.AddMvc();
}

Modifiez le fichier appsettings.Development.json pour configurer Serilog

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Serilog": {
    "Enrich": [
      "FromLogContext",
      "WithMachineName"
    ],
    "Properties": {
      "Application": "MyApp"
    },
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "http://localhost:9200",
          "indexFormat": "myapp-{0:yyyy.MM}",
          "autoRegisterTemplate": true,
          "minimumLogEventLevel": "Information",
          "connectionGlobalHeaders": "Authorization=Basic cGFzc3dvcmQ="
        }
      }
    ]
  }
}
  • Properties.Application : le nom de votre application tel qui remontera dans Kibana
  • WriteTo.Name : le sink Serilog (middleware), dans notre cas Elasticsearch
  • WriteTo.Args.nodeUris : l'url d'accès à l'API Elasticsearch
  • WriteTo.Args.indexFormat : le pattern du nom de l'index Elasticsearch dans lequel les logs seront écrits. ATTENTION à la casse, l'index doit être en minuscule.
  • WriteTo.Args.connectionGlobalHeaders : le header d'authentification à passer dans la requête. A utiliser si vous souhaitez sécuriser Elasticsearch & Kibana avec un Nginx en reverse porxy comme expliqué ici. Le mot de passe est encodé en base64 (cGFzc3dvcmQ= équivaut à password).

Injecter une instance du logger dans le controleur ValuesController.cs

private readonly ILogger _logger;

public ValuesController(ILogger logger)
{
    _logger = logger;
}

Ajouter un log dans une action du controller

// GET api/values
[HttpGet]
public IEnumerable Get()
{
    **_logger.LogInformation("Log Get All");**
    return new string[] {"value1", "value2"};
}

Visualiser les logs dans Kibana

Lancez l'application (en mode Developpement) et accédez à la ressource values afin de générer le log (http://localhost:5000/api/values). Ouvrez Kibana et configurez l'index myapp-* Un fois l'index créé allez dans "Discover" pour visualiser vos logs.

Conclusion

Nous avons vu comment configurer .net core pour logger dans Elasticsearch et Kibana. Cette solution offre de nombreux avantages et je vous invite à découvrir le champ des possibles sur le site d'Elastic. Les sources sont disponibles ici : https://github.com/uniteeio/dotnet-core-elasticsearch-kibana/tree/final

@FabienPaitry

Twitter / LinkedIn / Instagram / Facebook / Meetup / SlideShare