public async Task InvokeAsync(HttpContext context) { var stopWatch = System.Diagnostics.Stopwatch.StartNew(); context.Request.EnableBuffering(); var originalBodyStream = context.Response.Body; using var responseBody = new MemoryStream(); context.Response.Body = responseBody; var level = CurrentLoggingLevel; HttpEventData httpEventData = new HttpEventData(); var template = level < LogEventLevel.Information ? DBG_LOG_TEMPLATE : INF_LOG_TEMPLATE; try { await Next(context); httpEventData = await ReadRequestInfo(context); } catch (Exception ex) { template = ERR_LOG_TEMPLATE; level = LogEventLevel.Error; httpEventData.Exception = ex; context.Response.StatusCode = 500; httpEventData.StatusCode = 500; } finally { httpEventData.ElapsedMS = stopWatch.ElapsedMilliseconds; var data = httpEventData.GetEventData(Settings.LogLevel); if (level >= LogEventLevel.Error) { Logger.Error(template, data); } else { Logger.Information(template, data); } await responseBody.CopyToAsync(originalBodyStream); } }
private async Task <HttpEventData> ReadRequestInfo(HttpContext context) { var body = context.Request.Body; var routeData = context.GetRouteData(); var controller = routeData != null ? routeData.Values["controller"]?.ToString().SafeString() : "controller_not_available"; var action = routeData != null ? routeData.Values["action"]?.ToString().SafeString() : "action_not_available"; var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)]; await context.Request.Body.ReadAsync(buffer, 0, buffer.Length); context.Request.Body = body; var requestData = new HttpEventData() { ControllerName = controller, ActionName = action, RequestBody = System.Text.Encoding.UTF8.GetString(buffer), Method = context.Request.Method, UserID = context.User.Identity.Name }; context.Response.Body.Seek(0, SeekOrigin.Begin); #pragma warning disable IDE0067 requestData.ResponseBody = await new StreamReader(context.Response.Body).ReadToEndAsync(); #pragma warning restore IDE0067 requestData.StatusCode = context.Response.StatusCode; context.Response.Body.Seek(0, SeekOrigin.Begin); requestData.RequestPath = context.Request.GetDisplayUrl(); return(requestData); }