using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using NLog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebApplication8
{
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly Logger _logger;
public RequestResponseLoggingMiddleware(RequestDelegate next)
{
_next = next;
_logger = LogManager.GetCurrentClassLogger();
}
public async Task Invoke(HttpContext context)
{
string userName = "", requestInfo = "", responseInfo = "";
var originalBodyStream = context.Response.Body;
var stopwach = Stopwatch.StartNew();
try
{
requestInfo = await FormatRequest(context.Request);
//context.Items["requestInfo"] = requestInfo;
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await _next(context);
stopwach.Stop();
responseInfo = await FormatResponse(context.Response);
//context.Items["responseInfo"] = responseInfo;
await responseBody.CopyToAsync(originalBodyStream);
}
userName = Convert.ToString(context.Items["userName"]);
var logMsg = $@"{userName} 请求信息: {requestInfo}{Environment.NewLine}响应信息: {responseInfo}{Environment.NewLine}耗时: {stopwach.ElapsedMilliseconds}ms";
_logger.Log(LogLevel.Info, logMsg);
}
catch (Exception ex)
{
stopwach.Stop();
if (ex != null)
{
var logMsg = $@"{userName} 请求信息: {requestInfo}{Environment.NewLine}异常: {ex.ToString()}{Environment.NewLine}耗时: {stopwach.ElapsedMilliseconds}ms";
_logger.Log(LogLevel.Error, logMsg);
_logger.Log(LogLevel.Error, ex.ToString());
var errResult = new ReturnValue(ResultCode.系统发生错误, ex.Message);
var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(errResult));
await originalBodyStream.WriteAsync(bytes, 0, bytes.Length);
}
}
}
private async Task<string> FormatRequest(HttpRequest request)
{
HttpRequestRewindExtensions.EnableBuffering(request);
var body = request.Body;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
var bodyAsText = Encoding.UTF8.GetString(buffer);
body.Seek(0, SeekOrigin.Begin);
request.Body = body;
return $" {request.Method} {request.Scheme}://{request.Host}{request.Path} {request.QueryString} {bodyAsText}";
}
private async Task<string> FormatResponse(HttpResponse response)
{
response.Body.Seek(0, SeekOrigin.Begin);
var text = await new StreamReader(response.Body).ReadToEndAsync();
response.Body.Seek(0, SeekOrigin.Begin);
return $"{response.StatusCode}: {text}";
}
}
}
放在startup的Configure方法所有中间件最上面
app.UseMiddleware<RequestResponseLoggingMiddleware>();