using System.Diagnostics; namespace LingAdmin.ApiGateway.Middleware; /// /// 请求日志中间件 /// public class RequestLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestLoggingMiddleware(RequestDelegate next, ILogger logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext context) { var stopwatch = Stopwatch.StartNew(); var requestId = Guid.NewGuid().ToString("N")[..8]; // Log request _logger.LogInformation( "[{RequestId}] {Method} {Path} - Start", requestId, context.Request.Method, context.Request.Path); // Add trace headers context.Response.Headers["X-Request-Id"] = requestId; context.Response.Headers["X-Correlation-Id"] = context.Request.Headers["X-Correlation-Id"].FirstOrDefault() ?? requestId; try { await _next(context); } finally { stopwatch.Stop(); var logLevel = context.Response.StatusCode >= 500 ? LogLevel.Error : context.Response.StatusCode >= 400 ? LogLevel.Warning : LogLevel.Information; _logger.Log( logLevel, "[{RequestId}] {Method} {Path} - {StatusCode} ({ElapsedMs}ms)", requestId, context.Request.Method, context.Request.Path, context.Response.StatusCode, stopwatch.ElapsedMilliseconds); } } }