Merge pull request '#180 Middleware pour mesurer le temps de réponse des requêtes HTTP.' (#182) from j3/feat/middleware-log into dev

Reviewed-on: https://10.4.0.131/gitea/DI1-P4-E1/Webzine/pulls/182
Reviewed-by: c.bobin <clement.bobin@diiage.org>
This commit is contained in:
c.bobin
2026-04-02 16:07:22 +02:00
2 changed files with 65 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
namespace Webzine.WebApplication.Middlewares
{
using System.Diagnostics;
public class LogTempsExecutionMiddleware
{
/// <summary>
/// log à chaque requete http.
/// </summary>
// _next représente le maillon suivant dans la chaîne (le prochain middleware ou le contrôleur)
private readonly RequestDelegate next;
private readonly ILogger<LogTempsExecutionMiddleware> logger;
// Le constructeur récupère "_next" et le Logger
public LogTempsExecutionMiddleware(RequestDelegate next, ILogger<LogTempsExecutionMiddleware> logger)
{
this.next = next;
this.logger = logger;
}
// méthode appelée à chaque requête HTTP
/// <summary>
/// Middleware chargé de journaliser le cycle de vie d'une requête HTTP (entrée, exécution, sortie et temps de réponse).
/// </summary>
/// <param name="context">Le contexte HTTP encapsulant toutes les informations de la requête et de la réponse.</param>
/// <returns>Une tâche (<see cref="Task"/>) représentant l'opération asynchrone.</returns>
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);
}
}
}
}

View File

@@ -93,6 +93,8 @@ try
var app = builder.Build();
app.UseMiddleware<Webzine.WebApplication.Middlewares.LogTempsExecutionMiddleware>();
if (repositoryType == RepositoryType.Db)
{
using (var scope = app.Services.CreateScope())