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

Tim*_*hko 7 .net logging asp.net-web-api asp.net-core

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

我将 ILogger 与配置一起使用:

"Logging": {
"LogLevel": {
  "Default": "Debug",
  "System": "Information",
  "Microsoft": "Information"
}
Run Code Online (Sandbox Code Playgroud)

并应要求我看到日志:

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

执行操作方法 ActivationService.Controllers.ActivationController.Post (ActivationService),在 174605.9201 毫秒内返回结果 Microsoft.AspNetCore.Mvc.ObjectResult。

有没有办法配置asp.net来记录响应和请求的跟踪主体

Ale*_*bov 5

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

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ....
    app.UseMiddleware<RequestResponseLoggingMiddleware>();
}
Run Code Online (Sandbox Code Playgroud)

  • 1)在你的例子中,我必须从“context.Request.Body = body;”改变 到“context.Request.Body.Position = 0;”,否则控制器中的请求为空 2)没关系,我可能会使用它。但是可能有一种方法可以配置标准的 asp 记录器来做到这一点? (2认同)
  • EnableRewind 是来自内部 Asp net 命名空间的方法,AFAIU 不保证它会公开工作。例如,我收到错误 System.TypeLoadException: Could not load type 'Microsoft.AspNetCore.Http.Internal.BufferingHelper' from assembly 'Microsoft.AspNetCore.Http...' 我建议使用“EnableBuffering()”,它具有同样的意思:“确保请求Body可以被多次读取。” (2认同)