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())