NLog Integration for Microsoft System.Diagnostics.DiagnosticSource and Activity TraceId / SpanId
$ dotnet add package NLog.DiagnosticSourceNLog ActivityTraceLayoutRenderer for Microsoft Activity Trace
NLog DiagnosticListenerTarget for Microsoft DiagnosticSource
Install the package
Install-Package NLog.DiagnosticSource or in your csproj:
<PackageReference Include="NLog.DiagnosticSource" Version="6.*" />
Add to your nlog.config:
<extensions>
<add assembly="NLog.DiagnosticSource"/>
</extensions>
Alternative register from code using fluent configuration API:
LogManager.Setup().SetupExtensions(ext => {
ext.RegisterTarget<NLog.Targets.DiagnosticListenerTarget>();
ext.RegisterLayoutRenderer<NLog.LayoutRenderers.ActivityTraceLayoutRenderer>();
});
The System.Diagnostics.Activity.Current from Microsoft allows one to create OpenTelemetry spans.
Example of NLog.config file that outputs span-details together with LogEvent by using ${activity}:
<nlog>
<extensions>
<add assembly="NLog.DiagnosticSource"/>
</extensions>
<targets>
<target name="console" xsi:type="console" layout="${message}|ActivityId=${activity:property=TraceId}" />
</targets>
<rules>
<logger minLevel="Info" writeTo="console" />
</rules>
</nlog>
Property Enum Values
Format="@" for json-dictionary)Format="@" for json-dictionary)Format="@" for json-array)format="d"format="d"Ok or Error). For int-value combine with format="d"0 or 1)Formatting
${activity:property=Baggage:item=BaggageKey}${activity:property=Tags:item=TagKey}${activity:property=CustomProperty:item=PropertyKey}Extract property values from parent or root
It is possible to specify that the above property should be extracted from either root- or parent-activity.
${activity:property=OperationName:parent=true}
${activity:property=OperationName:root=true}
Manually configure ActivityTrackingOptions
When using the default HostBuilder then it will automatically setup the following ActivityTrackingOptions:
builder.ConfigureLogging((hostingContext, loggingBuilder) =>
{
loggingBuilder.Configure(options =>
{
options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
| ActivityTrackingOptions.TraceId
| ActivityTrackingOptions.ParentId;
});
}).If creating a custom HostBuilder, then one have to manually setup the ActivityTrackingOptions like shown above.
Example of NLog.config file that uses the diagnosticListener target:
<nlog>
<extensions>
<add assembly="NLog.DiagnosticSource"/>
</extensions>
<targets>
<target name="diagSource" xsi:type="diagnosticListener" layout="${message}" sourceName="nlog" eventName="${logger}" />
</targets>
<rules>
<logger minLevel="Info" writeTo="diagSource" />
</rules>
</nlog>