Skip to content

Instantly share code, notes, and snippets.

@pedrovasconcellos
Created January 30, 2019 19:28
Show Gist options
  • Save pedrovasconcellos/de2b0d647edaa7de5465e4f3027f1a2e to your computer and use it in GitHub Desktop.
Save pedrovasconcellos/de2b0d647edaa7de5465e4f3027f1a2e to your computer and use it in GitHub Desktop.
Logging Middleware ASP.NET Core
//Use => [ app.UseRequestResponseLogging() ] inside [Class: Startup; Method: Configure;].
using Microsoft.AspNetCore.Builder;
namespace Vasconcellos.WebAPI.Extensions
{
/// <summary>
/// RequestResponseLoggingMiddlewareExtensions
/// </summary>
/// <remarks>
/// Caller of the Middleware that creates the WebAPI Information Log.
/// </remarks>
public static class RequestResponseLoggingMiddlewareExtensions
{
/// <summary>
/// UseRequestResponseLogging
/// </summary>
/// <remarks>
/// Caller of the Middleware that creates the WebAPI Information Log.
/// </remarks>
public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestResponseLoggingMiddleware>();
}
}
}
using Microsoft.AspNetCore.Http;
using System;
using Microsoft.Extensions.Logging;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Internal;
using System.Text;
namespace Vasconcellos.WebAPI.Extensions
{
/// <summary>
/// RequestResponseLoggingMiddleware
/// </summary>
/// <remarks>
/// Middleware that creates the WebAPI Information Log.
/// </remarks>
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
/// <summary>
/// RequestResponseLoggingMiddleware
/// </summary>
/// <remarks>
/// Middleware that creates the WebAPI Information Log.
/// </remarks>
public RequestResponseLoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory
.CreateLogger<RequestResponseLoggingMiddleware>();
}
/// <summary>
/// Invoke
/// </summary>
/// <remarks>
/// Invoker of the Middleware that creates the WebAPI Information Log.
/// </remarks>
public async Task Invoke(HttpContext context)
{
_logger.LogInformation(await FormatRequest(context.Request));
var originalBodyStream = context.Response.Body;
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await _next(context);
_logger.LogInformation(await FormatResponse(context.Response));
await responseBody.CopyToAsync(originalBodyStream);
}
}
private async Task<string> FormatRequest(HttpRequest request)
{
request.EnableRewind();
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
var bodyAsText = Encoding.UTF8.GetString(buffer);
request.Body.Seek(0, SeekOrigin.Begin);
return $"{request.Scheme} {request.Host}{request.Path} {request.QueryString} {bodyAsText}".TrimEnd();
}
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: {text}";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment