|
@@ -0,0 +1,57 @@
|
|
|
+using EVCB_OCPP.DBAPI.Models.DBContext;
|
|
|
+using Microsoft.AspNetCore.Http.Extensions;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using System.Net;
|
|
|
+
|
|
|
+namespace EVCB_OCPP.DBAPI.Middleware;
|
|
|
+
|
|
|
+public class APILogMiddleware
|
|
|
+{
|
|
|
+ private readonly RequestDelegate _next;
|
|
|
+ private readonly ILogger<APILogMiddleware> logger;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public APILogMiddleware(RequestDelegate next,
|
|
|
+ ILogger<APILogMiddleware> logger)
|
|
|
+ {
|
|
|
+ _next = next;
|
|
|
+ this.logger = logger;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task Invoke(HttpContext context)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var request = context.Request;
|
|
|
+ CancellationToken cancellationToken = context?.RequestAborted ?? CancellationToken.None;
|
|
|
+
|
|
|
+ logger.LogTrace("{Id}:{Method} {Path} {Body}",context.TraceIdentifier , context.Request.Method, context.Request.Path, context.GetPreLoadBody());
|
|
|
+
|
|
|
+ var originalBodyStream = context.Response.Body;
|
|
|
+ var fakeResponseBody = new MemoryStream();
|
|
|
+ context.Response.Body = fakeResponseBody;
|
|
|
+
|
|
|
+ var task = _next(context);
|
|
|
+ await task;
|
|
|
+
|
|
|
+ fakeResponseBody.Seek(0, SeekOrigin.Begin);
|
|
|
+ await fakeResponseBody.CopyToAsync(originalBodyStream);
|
|
|
+
|
|
|
+ string bodyData = string.Empty;
|
|
|
+ if (fakeResponseBody != null)
|
|
|
+ {
|
|
|
+ fakeResponseBody.Seek(0, SeekOrigin.Begin);
|
|
|
+ bodyData = new StreamReader(fakeResponseBody).ReadToEnd();
|
|
|
+ fakeResponseBody.Seek(0, SeekOrigin.Begin);
|
|
|
+ }
|
|
|
+
|
|
|
+ logger.LogTrace("{Id}:{StatusCode} {Body}", context.TraceIdentifier, context.Response.StatusCode, bodyData);
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ logger.LogError(e.Message);
|
|
|
+ logger.LogTrace(e.StackTrace);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|