首页 文章

配置.net核心日志记录以记录请求和响应

提问于
浏览
0

我正在开发asp .net core 2.1 WEB-API应用程序 .

我使用ILogger配置:

"Logging": {
"LogLevel": {
  "Default": "Debug",
  "System": "Information",
  "Microsoft": "Information"
}

并根据要求我看到日志:

info:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [1]使用参数执行操作方法ActivationService.Controllers.ActivationController.Post(ActivationService)(ActivationService.Contracts.ActivationRequest) - 验证状态:有效

执行的操作方法ActivationService.Controllers.ActivationController.Post(ActivationService),返回结果Microsoft.AspNetCore.Mvc.ObjectResult in 174605.9201ms .

是否有办法使用跟踪 body 的响应和请求来使用asp.net进行日志记录?

1 回答

  • 1

    是的,您可以实现日志记录中间件:

    public class RequestResponseLoggingMiddleware
        {
            private readonly RequestDelegate next;
            private readonly ILogger logger;
    
            public RequestResponseLoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
            {
                this.next = next;
                logger = loggerFactory.CreateLogger<RequestResponseLoggingMiddleware>();
            }
    
            public async Task Invoke(HttpContext context)
            {
                context.Request.EnableRewind();
    
                var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
                await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
                var requestBody = Encoding.UTF8.GetString(buffer);
                context.Request.Body.Seek(0, SeekOrigin.Begin);
    
                logger.LogInformation(requestBody);
    
                var originalBodyStream = context.Response.Body;
    
                using (var responseBody = new MemoryStream())
                {
                    context.Response.Body = responseBody;
    
                    await next(context);
    
                    context.Response.Body.Seek(0, SeekOrigin.Begin);
                    var response = await new StreamReader(context.Response.Body).ReadToEndAsync();
                    context.Response.Body.Seek(0, SeekOrigin.Begin);
    
                    logger.LogInformation(response);
                    await responseBody.CopyToAsync(originalBodyStream);
                }
            }
        }
    

    然后在Configure方法中将其添加到application Builder:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ....
        app.UseMiddleware<RequestResponseLoggingMiddleware>();
    }
    

相关问题