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