private static void WriteLog(HttpMiddlewareModel model) { if (!model.Request.Url.Contains("swagger") && !model.Request.Url.Contains("html")) { _logger.LogDebug("============================================================================"); _logger.LogDebug($"Start:{model.ExecuteStart}"); _logger.LogDebug($"Url:{model.Request.Url}"); _logger.LogDebug($"Header:"); _logger.LogDebug($"{string.Join("\r\n ", model.Request.Header.ToArray())}"); _logger.LogDebug($"Request:{model.Request.Param}"); _logger.LogDebug($"Response:"); _logger.LogDebug($"{JsonConvert.SerializeObject(model.Response)}"); _logger.LogDebug($"End:{model.ExecuteEnd}"); _logger.LogDebug($"ElapsedTime:{model.ElapsedTime}"); _logger.LogDebug("============================================================================"); } }
/// <summary> /// 拦截请求参数打印日志 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task Invoke(HttpContext context) { _stopwatch.Restart(); var request = context.Request; if (request.Path.Value.Contains("upload") || request.Path.Value.EndsWith(".dll")) { await _next(context); } else { var model = new HttpMiddlewareModel() { }; model.Request = new RequestBody(); model.ExecuteStart = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); model.Request.Url = request.Path.ToString(); model.Request.Header = request.Headers.ToDictionary(x => x.Key, v => string.Join(";", v.Value.ToList())); model.Request.Method = request.Method; try { // 获取请求body内容 if (request.Method.ToLower().Equals("post")) { // 启用倒带功能,就可以让 Request.Body 可以再次读取 request.EnableBuffering(); Stream stream = request.Body; byte[] buffer = new byte[request.ContentLength.Value]; await stream.ReadAsync(buffer, 0, buffer.Length); model.Request.Param = Encoding.Default.GetString(buffer); request.Body.Position = 0; } else if (request.Method.ToLower().Equals("get")) { model.Request.Param = request.QueryString.Value; } //// 获取Response.Body内容 var originalBodyStream = context.Response.Body; await using var responseBody = new MemoryStream(); context.Response.Body = responseBody; try { await _next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } model.Response = await GetResponse(context.Response); model.ExecuteEnd = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); await responseBody.CopyToAsync(originalBodyStream); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } // 响应完成记录时间和存入日志 context.Response.OnCompleted(() => { _stopwatch.Stop(); model.ElapsedTime = $"{_stopwatch.ElapsedMilliseconds }ms"; WriteLog(model); return(Task.CompletedTask); }); } }