In systems where events are processed in several microservices is useful to maintain a request identifier to be able to link logs from each microservice to do some investigation or to measure performance.
So far we have relied in a custom http header and owin middleware to read, add a new segment to this request identifier and then set it in the log4net context so it can be written when logging an event.
For a new asp.net core service I'm working, I have quickly put together new middleware to do the same operation using the documentation, but instead of using log4net I have found that it is easier to use NLog to capture the TraceIdentifier property in the HttpContext.
Middleware
public class TransactionLinkingMiddleware{
private readonly RequestDelegate _next;
public const string ParentTransactionHttpHeader = "Transaction-Link";
public TransactionLinkingMiddleware(RequestDelegate next)
{
public const string ParentTransactionHttpHeader = "Transaction-Link";
public TransactionLinkingMiddleware(RequestDelegate next)
{
_next = next;
}
public Task
Invoke(HttpContext context)
{
if (context.Request.Headers.TryGetValue(ParentTransactionHttpHeader, out var headerValues)
&& headerValues.Any())
&& headerValues.Any())
{
context.TraceIdentifier = $"{headerValues.First()}/{context.TraceIdentifier}";
}
}
// Call the next delegate/middleware in the
pipeline
return this._next(context);
}
}
public static class TransactionLinkingMiddlewareExtensions{
public static IApplicationBuilder
UseTransactionLinking(this IApplicationBuilder
builder)
{
{
return builder.UseMiddleware<TransactionLinkingMiddleware>();
}
}
}
Startup.cs
public Startup(IConfiguration
configuration, IHostingEnvironment env)
{
{
Configuration =
configuration; env.ConfigureNLog("NLog.config");
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment
env,
ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime)
ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseTransactionLinking();
loggerFactory.AddNLog();
app.UseMvc();
}
NLog.config
<?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target xsi:type="File" name="File"
fileName="${basedir}/logs/log.txt"
layout="TimeStamp=${longdate} Level=${uppercase:${level}} Transaction=${aspnet-TraceIdentifier} Message=${message}" />
</targets>
fileName="${basedir}/logs/log.txt"
layout="TimeStamp=${longdate} Level=${uppercase:${level}} Transaction=${aspnet-TraceIdentifier} Message=${message}" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="File" />
</rules>
</nlog>
No comments:
Post a Comment