namespace Webzine.WebApplication.Middlewares
{
using System.Diagnostics;
public class LogTempsExecutionMiddleware
{
///
/// log à chaque requete http.
///
// _next représente le maillon suivant dans la chaîne (le prochain middleware ou le contrôleur)
private readonly RequestDelegate next;
private readonly ILogger logger;
// Le constructeur récupère "_next" et le Logger
public LogTempsExecutionMiddleware(RequestDelegate next, ILogger logger)
{
this.next = next;
this.logger = logger;
}
// méthode appelée à chaque requête HTTP
///
/// Middleware qui log pour suivre la vie d'une requete.
///
///
/// A representing the asynchronous operation.
public async Task InvokeAsync(HttpContext context)
{
// (Avant le contrôleur)
var chronometre = Stopwatch.StartNew(); // lance le chrono
// --- IN ---
var methode = context.Request.Method;
var endpoint = context.Request.Path;
var traceId = context.TraceIdentifier; // Identifiant unique généré par .NET
this.logger.LogInformation($"[IN] TraceId: {traceId} | Méthode: {methode} | Endpoint: {endpoint}");
await this.next(context);
// (Après le contrôleur)
chronometre.Stop(); // arrête le chrono
var tempsEcoule = chronometre.ElapsedMilliseconds;
var httpCode = context.Response.StatusCode; // exemple: 200, 404, 500
// --- OUT ---
if (httpCode >= 500)
{
this.logger.LogError($"[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}");
}
else if (httpCode >= 400)
{
this.logger.LogWarning($"[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}");
}
else
{
this.logger.LogInformation($"[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}");
}
}
}
}