diff --git a/Webzine.WebApplication/Middlewares/LogTempsExecutionMiddleware.cs b/Webzine.WebApplication/Middlewares/LogTempsExecutionMiddleware.cs new file mode 100644 index 0000000..1b86308 --- /dev/null +++ b/Webzine.WebApplication/Middlewares/LogTempsExecutionMiddleware.cs @@ -0,0 +1,63 @@ +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 chargé de journaliser le cycle de vie d'une requête HTTP (entrée, exécution, sortie et temps de réponse). + /// + /// Le contexte HTTP encapsulant toutes les informations de la requête et de la réponse. + /// Une tâche () représentant l'opération asynchrone. + 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}", traceId, methode, 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}", traceId, httpCode, tempsEcoule, endpoint); + } + else if (httpCode >= 400) + { + this.logger.LogWarning("[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}", traceId, httpCode, tempsEcoule, endpoint); + } + else + { + this.logger.LogInformation("[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}", traceId, httpCode, tempsEcoule, endpoint); + } + } + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index 935e2da..be8a92c 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -93,6 +93,8 @@ try var app = builder.Build(); + app.UseMiddleware(); + if (repositoryType == RepositoryType.Db) { using (var scope = app.Services.CreateScope())