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
- Installer .net Core 2.0 SDK
- Installer Docker + Docker Compose
Configurer l'application pour rediriger les logs dans Elasticsearch
Cloner le projet .net core (web api)
<pre>_git clone https://github.com/uniteeio/dotnet-core-elasticsearch-kibana_</pre>Lancer Elasticsearch et Kibana Placez-vous à la racine du projet et exécuter la commande suivante :
<pre>docker-compose up -d</pre>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
- Déclarez le service Serilog dans le conteneur de services
Modifiez le fichier appsettings.Development.json pour configurer Serilog
<pre>{ "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=" } } ] } }</pre>- 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
<pre>private readonly ILogger _logger; public ValuesController(ILogger<ValuesController> logger) { _logger = logger; }</pre>Ajouter un log dans une action du controller
<pre>// GET api/values [HttpGet] public IEnumerable<string> Get() { **_logger.LogInformation("Log Get All");** return new string[] {"value1", "value2"}; }</pre>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
Twitter / LinkedIn / Instagram / Facebook / Meetup / SlideShare