我需要在asp.net core 2.0 Web应用程序中记录请求/响应。为此,我们创建了一个RequestLoggingMiddleware(请参见下文)。
该解决方案的缺点在于,将在每个请求中读取主体流。有没有一种方法可以评估是否有针对特定日志级别配置的logprovider。例如,在没有logprovider正在侦听DebugLog-Level的情况下,我们不需要读取主体流。
public class RequestLoggingMiddleware
{
public ILogger<RequestLoggingMiddleware> Logger { get; }
public RequestDelegate NextMiddleware { get; }
public RequestLoggingMiddleware(RequestDelegate nextMiddleware, ILogger<RequestLoggingMiddleware> logger)
{
NextMiddleware = nextMiddleware;
Logger = logger;
}
public async Task Invoke(HttpContext context)
{
using (MemoryStream loggableResponseStream = new MemoryStream())
{
Logger.LogDebug(await FormatRequest(context.Request));
await NextMiddleware(context);
}
}
private static async Task<string> FormatRequest(HttpRequest request)
{
Stream body = request.Body;
request.EnableRewind();
byte[] buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
string bodyAsText = Encoding.UTF8.GetString(buffer);
request.Body = body;
var messageObjToLog = new
{
scheme = request.Scheme,
host = request.Host,
path = request.Path,
queryString = request.Query,
requestBody = bodyAsText
};
return JsonConvert.SerializeObject(messageObjToLog);
}
}
月关宝盒
相关分类