Skip to content
Snippets Groups Projects

Fix: Fixed the logging Middleware

1 file
+ 145
88
Compare changes
  • Side-by-side
  • Inline
@@ -11,18 +11,13 @@ using System.IO;
@@ -11,18 +11,13 @@ using System.IO;
using System.Linq;
using System.Linq;
using System.Text;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks;
#region DupFinder Exclusion
namespace Coscine.ApiCommons.Middleware
namespace Coscine.ApiCommons.Middleware
{
{
class LoggingMiddleware
public class LoggingMiddleware
{
{
private readonly RequestDelegate _next;
private readonly RequestDelegate _next;
private readonly CoscineLogger _coscineLogger;
private readonly CoscineLogger _coscineLogger;
private string _uri;
private string _request;
private string _requestBody;
private string _responseBody;
private string _statusCode;
public LoggingMiddleware(ILogger<LoggingMiddleware> logger, RequestDelegate next)
public LoggingMiddleware(ILogger<LoggingMiddleware> logger, RequestDelegate next)
{
{
@@ -32,104 +27,166 @@ namespace Coscine.ApiCommons.Middleware
@@ -32,104 +27,166 @@ namespace Coscine.ApiCommons.Middleware
public async Task Invoke(HttpContext context)
public async Task Invoke(HttpContext context)
{
{
// reading of the request header
string _uri = "";
_uri = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}";
string _request = "";
_request = $"Uri: {_uri} Method: {context.Request.Method}";
string _requestBody = "";
string _responseBody = "";
CoscineLogger.SetUri(_uri);
string _statusCode = "";
// Get the User Id
using (MemoryStream requestBodyStream = new MemoryStream())
var authorization = context.Request.Headers["Authorization"].ToArray();
string bearer = null;
foreach (var line in authorization)
{
{
if (line.Contains("Bearer"))
using (MemoryStream responseBodyStream = new MemoryStream())
{
{
bearer = line;
Stream originalRequestBody = context.Request.Body;
}
context.Request.EnableRewind();
}
Stream originalResponseBody = context.Response.Body;
if (!string.IsNullOrWhiteSpace(bearer))
{
bearer = bearer.Replace("Bearer", "").Trim();
JWTHandler jwtHandler = new JWTHandler(new ConsulConfiguration());
var claims = jwtHandler.GetContents(bearer);
var userClaim = (from claimObj in claims
where claimObj.Type == "UserId"
select claimObj).First();
CoscineLogger.SetUserId(userClaim.Value);
}
// Get the corrolation Id
context.Request.Headers.TryGetValue("X-Coscine-Logging-CorrelationId", out StringValues corrolationid);
if (corrolationid.Count == 1)
{
CoscineLogger.SetCorrolationId(corrolationid.ToString());
}
else
{
CoscineLogger.SetCorrolationId();
}
// Logging for Analytics
_coscineLogger.Log(LogType.Analytics, _request);
// reading of the request body
var body = context.Request.Body;
context.Request.EnableRewind();
var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
_requestBody = Encoding.UTF8.GetString(buffer);
context.Request.Body = body;
_coscineLogger.Log(LogType.Debug, $"{_request} RequestBody: {_requestBody}");
var debugLevelIsActive = CoscineLogger.LogLevelIsActivated(LogType.Debug);
// preparation of the response
var originalBodyStream = context.Response.Body;
try
{
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
try
try
{
{
// processing of the request
/*******************************************
 
* logging process
 
******************************************/
 
 
// reading of the request header
 
_uri = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}";
 
_request = $"Uri: {_uri} Method: {context.Request.Method}";
 
 
CoscineLogger.SetUri(_uri);
 
 
// Get the User Id
 
var authorization = context.Request.Headers["Authorization"].ToArray();
 
string bearer = null;
 
foreach (var line in authorization)
 
{
 
if (line.Contains("Bearer"))
 
{
 
bearer = line;
 
}
 
}
 
if (!string.IsNullOrWhiteSpace(bearer))
 
{
 
bearer = bearer.Replace("Bearer", "").Trim();
 
JWTHandler jwtHandler = new JWTHandler(new ConsulConfiguration());
 
var claims = jwtHandler.GetContents(bearer);
 
var userClaim = (from claimObj in claims
 
where claimObj.Type == "UserId"
 
select claimObj).First();
 
CoscineLogger.SetUserId(userClaim.Value);
 
}
 
 
// Get the corrolation Id
 
context.Request.Headers.TryGetValue("X-Coscine-Logging-CorrelationId", out StringValues corrolationid);
 
if (corrolationid.Count == 1)
 
{
 
CoscineLogger.SetCorrolationId(corrolationid.ToString());
 
}
 
else
 
{
 
CoscineLogger.SetCorrolationId();
 
}
 
 
// Logging for Analytics
 
_coscineLogger.Log(LogType.Analytics, _request);
 
 
 
/*******************************************
 
* preparation of the logging process
 
******************************************/
 
if (debugLevelIsActive)
 
{
 
// write a log entry if fields are missing
 
if (!(context.Request.Method.Equals("GET") || context.Request.Method.Equals("DELETE")) && (context.Request.ContentType == null || context.Request.ContentType == ""))
 
{
 
_coscineLogger.Log(LogType.Debug, $"{_request} No MimeType specified for Request.");
 
}
 
// only log short requests or request that contain json
 
if (context.Request.ContentLength < 500000 || (context.Request.ContentType != null && context.Request.ContentType.Contains("json")))
 
{
 
context.Request.Body.CopyTo(requestBodyStream);
 
requestBodyStream.Seek(0, SeekOrigin.Begin);
 
 
_requestBody = new StreamReader(requestBodyStream).ReadToEnd();
 
 
requestBodyStream.Seek(0, SeekOrigin.Begin);
 
context.Request.Body = requestBodyStream;
 
}
 
else
 
{
 
_requestBody = "No Request Body or Request Body to long.";
 
}
 
 
_coscineLogger.Log(LogType.Debug, $"{_request} RequestBody: {_requestBody}");
 
_responseBody = "Default Response Body";
 
context.Response.Body = responseBodyStream;
 
}
 
 
/*******************************************
 
* processing of the request
 
******************************************/
 
await _next(context);
await _next(context);
 
 
/*******************************************
 
* processing of the response
 
******************************************/
 
 
_statusCode = $"{context.Response.StatusCode}";
 
CoscineLogger.SetStatus(_statusCode);
 
 
// log every message on high that has a non 200-399 StatusCode
 
if (context.Response.StatusCode < StatusCodes.Status200OK || context.Response.StatusCode >= StatusCodes.Status400BadRequest)
 
{
 
_coscineLogger.Log(LogType.High, $"{_request} StatusCode: {_statusCode}");
 
}
 
 
if (debugLevelIsActive && context.Response.StatusCode != StatusCodes.Status204NoContent)
 
{
 
// Write a log entry if fields are missing
 
if (context.Response.ContentType == null || context.Response.ContentType == "")
 
{
 
_coscineLogger.Log(LogType.Debug, $"{_request} No MimeType specified for Response.");
 
}
 
 
// only log short responses or responses that return json
 
if (context.Response.ContentLength < 500000 || (context.Response.ContentType != null && context.Response.ContentType.Contains("json")))
 
{
 
responseBodyStream.Seek(0, SeekOrigin.Begin);
 
_responseBody = new StreamReader(responseBodyStream).ReadToEnd();
 
}
 
else
 
{
 
_responseBody = "No Response Body or Response Body to long.";
 
}
 
 
responseBodyStream.Seek(0, SeekOrigin.Begin);
 
await responseBodyStream.CopyToAsync(originalResponseBody);
 
}
 
_coscineLogger.Log(LogType.Debug, $"{_request} RequestBody: {_requestBody} StatusCode: {_statusCode} ResponseBody: {_responseBody}");
 
}
}
catch (Exception ex)
catch (Exception ex)
{
{
_coscineLogger.Log(LogType.Critical, $"An uncaught Exception occured while processing the request: {_request}", ex);
_coscineLogger.Log(LogType.Critical, $"An uncaught Exception occured while processing the request: {_request}", ex);
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
if (!context.Response.HasStarted)
 
{
 
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
 
byte[] data = System.Text.Encoding.UTF8.GetBytes("Unhandled Error occured. Please, try again in a while.");
 
context.Response.ContentLength = data.Length;
 
originalResponseBody.Write(data, 0, data.Length);
 
}
}
}
finally
_statusCode = $"{context.Response.StatusCode}";
CoscineLogger.SetStatus(_statusCode);
// log every message on high that has a non 200-399 StatusCode
if (context.Response.StatusCode < StatusCodes.Status200OK || context.Response.StatusCode >= StatusCodes.Status400BadRequest)
{
{
_coscineLogger.Log(LogType.High, $"{_request} StatusCode: {_statusCode}");
context.Request.Body = originalRequestBody;
 
if (context.Response.StatusCode != StatusCodes.Status204NoContent)
 
{
 
context.Response.Body = originalResponseBody;
 
}
}
}
_coscineLogger.Log(LogType.Debug, $"{_request} RequestBody: {_requestBody} StatusCode: {_statusCode}");
responseBody.Position = 0;
_responseBody = await new StreamReader(responseBody).ReadToEndAsync();
responseBody.Position = 0;
_coscineLogger.Log(LogType.Debug, $"{_request} RequestBody: {_requestBody} StatusCode: {_statusCode}");
await responseBody.CopyToAsync(originalBodyStream);
}
}
}
}
finally
{
context.Response.Body = originalBodyStream;
}
}
}
}
}
}
}
#endregion
\ No newline at end of file
Loading