using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Serilog.Context; namespace CodePlay.WebAPI.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 requestId = Guid.NewGuid().ToString("N")[..8]; var stopwatch = System.Diagnostics.Stopwatch.StartNew(); // 添加请求上下文到日志 using (LogContext.PushProperty("RequestId", requestId)) using (LogContext.PushProperty("RequestMethod", context.Request.Method)) using (LogContext.PushProperty("RequestPath", context.Request.Path)) using (LogContext.PushProperty("UserAgent", context.Request.Headers.UserAgent.ToString())) { try { _logger.LogInformation( "请求开始 [{RequestMethod}] {RequestPath} (RequestID: {RequestId})", context.Request.Method, context.Request.Path, requestId ); await _next(context); stopwatch.Stop(); _logger.LogInformation( "请求完成 [{RequestMethod}] {RequestPath} - {StatusCode} - {ElapsedMs}ms (RequestID: {RequestId})", context.Request.Method, context.Request.Path, context.Response.StatusCode, stopwatch.ElapsedMilliseconds, requestId ); } catch (Exception ex) { stopwatch.Stop(); _logger.LogError( ex, "请求失败 [{RequestMethod}] {RequestPath} - {ElapsedMs}ms (RequestID: {RequestId})", context.Request.Method, context.Request.Path, stopwatch.ElapsedMilliseconds, requestId ); throw; } } } } // 扩展方法 public static class RequestLoggingMiddlewareExtensions { public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder) { return builder.UseMiddleware(); } }