Skip to content

Commit b664aee

Browse files
Update logging to filter health checks
1 parent 19262b1 commit b664aee

4 files changed

Lines changed: 188 additions & 5 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Microsoft.AspNetCore.Http;
7+
using Microsoft.AspNetCore.Http.Extensions;
8+
using Shared.General;
9+
10+
namespace Shared.Middleware
11+
{
12+
using System.Security.Policy;
13+
using NLog;
14+
using Logger = Logger.Logger;
15+
16+
public class RequestLoggingMiddlewareTemp
17+
{
18+
#region Fields
19+
20+
/// <summary>
21+
/// The next
22+
/// </summary>
23+
private readonly RequestDelegate next;
24+
25+
#endregion
26+
27+
#region Constructors
28+
/// <summary>
29+
/// Initializes a new instance of the <see cref="RequestLoggingMiddleware"/> class.
30+
/// </summary>
31+
/// <param name="next">The next.</param>
32+
public RequestLoggingMiddlewareTemp(RequestDelegate next)
33+
{
34+
this.next = next;
35+
}
36+
#endregion
37+
38+
#region Public Methods
39+
40+
#region public async Task Invoke(HttpContext context)
41+
/// <summary>
42+
/// Invokes the specified context.
43+
/// </summary>
44+
/// <param name="context">The context.</param>
45+
/// <returns></returns>
46+
public async Task Invoke(HttpContext context)
47+
{
48+
var requestBodyStream = new MemoryStream();
49+
var originalRequestBody = context.Request.Body;
50+
51+
await context.Request.Body.CopyToAsync(requestBodyStream);
52+
requestBodyStream.Seek(0, SeekOrigin.Begin);
53+
54+
var url = UriHelper.GetDisplayUrl(context.Request);
55+
var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd();
56+
StringBuilder logMessage = new StringBuilder();
57+
logMessage.Append($"Request: Method: {context.Request.Method} Url: {url}");
58+
if (!String.IsNullOrEmpty(requestBodyText))
59+
{
60+
logMessage.Append(" ");
61+
logMessage.Append($"Body: {requestBodyText}");
62+
}
63+
64+
LogMessage(url, logMessage);
65+
66+
requestBodyStream.Seek(0, SeekOrigin.Begin);
67+
context.Request.Body = requestBodyStream;
68+
69+
await next(context);
70+
context.Request.Body = originalRequestBody;
71+
}
72+
73+
internal static Boolean IsHealthCheckRequest(String url) => url.EndsWith("/health");
74+
75+
internal static void LogMessage(String url,
76+
StringBuilder message)
77+
{
78+
if (IsHealthCheckRequest(url))
79+
{
80+
// TODO: new logger method??
81+
Logger.LogInformation($"HEALTH_CHECK | {message}");
82+
}
83+
else
84+
{
85+
Logger.LogInformation($"{message}");
86+
}
87+
}
88+
89+
#endregion
90+
91+
#endregion
92+
}
93+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.IO;
3+
using System.Text;
4+
using System.Threading.Tasks;
5+
using Microsoft.AspNetCore.Http;
6+
using Microsoft.AspNetCore.Http.Extensions;
7+
using Shared.General;
8+
9+
namespace Shared.Middleware
10+
{
11+
public class ResponseLoggingMiddlewareTemp
12+
{
13+
#region Fields
14+
15+
/// <summary>
16+
/// The next
17+
/// </summary>
18+
private readonly RequestDelegate next;
19+
20+
#endregion
21+
22+
#region Constructors
23+
/// <summary>
24+
/// Initializes a new instance of the <see cref="ResponseLoggingMiddleware"/> class.
25+
/// </summary>
26+
/// <param name="next">The next.</param>
27+
public ResponseLoggingMiddlewareTemp(RequestDelegate next)
28+
{
29+
this.next = next;
30+
}
31+
#endregion
32+
33+
#region Public Methods
34+
35+
#region public async Task Invoke(HttpContext context)
36+
/// <summary>
37+
/// Invokes the specified context.
38+
/// </summary>
39+
/// <param name="context">The context.</param>
40+
/// <returns></returns>
41+
public async Task Invoke(HttpContext context)
42+
{
43+
var url = UriHelper.GetDisplayUrl(context.Request);
44+
var bodyStream = context.Response.Body;
45+
46+
var responseBodyStream = new MemoryStream();
47+
context.Response.Body = responseBodyStream;
48+
49+
await next(context);
50+
51+
responseBodyStream.Seek(0, SeekOrigin.Begin);
52+
var responseBody = new StreamReader(responseBodyStream).ReadToEnd();
53+
StringBuilder logMessage = new StringBuilder();
54+
logMessage.Append($"Response: Status Code: {context.Response.StatusCode}");
55+
if (!String.IsNullOrEmpty(responseBody))
56+
{
57+
logMessage.Append(" ");
58+
logMessage.Append($"Body: {responseBody}");
59+
}
60+
//Logger.Logger.LogInformation(logMessage.ToString());
61+
RequestLoggingMiddlewareTemp.LogMessage(url, logMessage);
62+
63+
responseBodyStream.Seek(0, SeekOrigin.Begin);
64+
await responseBodyStream.CopyToAsync(bodyStream);
65+
}
66+
#endregion
67+
68+
#endregion
69+
}
70+
}

FileProcessor/Startup.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ namespace FileProcessor
5454
using Shared.Extensions;
5555
using Shared.General;
5656
using Shared.Logger;
57+
using Shared.Middleware;
5758
using Shared.Repositories;
5859
using Swashbuckle.AspNetCore.Filters;
5960
using TransactionProcessor.Client;
@@ -418,9 +419,11 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF
418419

419420
ConfigurationReader.Initialise(Startup.Configuration);
420421

421-
app.AddRequestLogging();
422-
app.AddResponseLogging();
422+
//app.AddRequestLogging();
423+
//app.AddResponseLogging();
423424
app.AddExceptionHandler();
425+
app.UseMiddleware<RequestLoggingMiddlewareTemp>();
426+
app.UseMiddleware<ResponseLoggingMiddlewareTemp>();
424427

425428
app.UseRouting();
426429

FileProcessor/nlog.config

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3-
43
<targets>
54
<target name="asyncFile" xsi:type="AsyncWrapper">
65
<target name="logfile" xsi:type="File"
@@ -10,11 +9,29 @@
109
archiveDateFormat="yyyyMMdd-HH"
1110
archiveEvery="Hour"
1211
keepFileOpen="false"
13-
maxArchiveFiles="24"/>/>
12+
maxArchiveFiles="24"/>
13+
<target name="healthlogfile" xsi:type="File"
14+
fileName="/home/txnproc/trace/fileprocessor_health.log"
15+
layout="${date:format=dd/MM/yyyy HH\:mm\:ss} | ${date:format=dd/MM/yyyy HH\:mm\:ss.ffff} | ${level} | ${callsite:className=true} | ${message} | ${exception:format=type,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method:InnerExceptionSeparator= | }"
16+
archiveNumbering="Date"
17+
archiveDateFormat="yyyyMMdd-HH"
18+
archiveEvery="Hour"
19+
keepFileOpen="false"
20+
maxArchiveFiles="24"/>
1421
</target>
1522
</targets>
1623

1724
<rules>
18-
<logger name="*" minlevel="Debug" writeTo="logfile"/>
25+
<logger name="Microsoft.*" minlevel="Debug" writeTo="" final="true" />
26+
<logger name="*" minlevel="Debug" writeTo="logfile">
27+
<filters defaultAction="Log">
28+
<when condition="contains('${message}', 'HEALTH_CHECK')" action="Ignore"></when>
29+
</filters>
30+
</logger>
31+
<logger name="*" minlevel="Debug" writeTo="healthlogfile">
32+
<filters defaultAction="Ignore">
33+
<when condition="contains('${message}', 'HEALTH_CHECK')" action="Log"></when>
34+
</filters>
35+
</logger>
1936
</rules>
2037
</nlog>

0 commit comments

Comments
 (0)