using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System.Diagnostics; using TakeoutSaaS.Shared.Abstractions.Diagnostics; namespace TakeoutSaaS.Shared.Web.Middleware; /// /// 基础请求日志(方法、路径、耗时、状态码、TraceId)。 /// public sealed class RequestLoggingMiddleware(RequestDelegate next, ILogger logger) { public async Task InvokeAsync(HttpContext context) { var stopwatch = Stopwatch.StartNew(); try { await next(context); } finally { stopwatch.Stop(); var traceId = TraceContext.TraceId ?? context.TraceIdentifier; var spanId = TraceContext.SpanId ?? Activity.Current?.SpanId.ToString() ?? string.Empty; logger.LogInformation( "HTTP {Method} {Path} => {StatusCode} ({Elapsed} ms) TraceId:{TraceId} SpanId:{SpanId}", context.Request.Method, context.Request.Path, context.Response.StatusCode, stopwatch.Elapsed.TotalMilliseconds, traceId, spanId); } } }