How to include logging scope into the log file using NLog
Asked Answered
L

2

11

I'm using NLog.Extensions.Logging.

When registering a logger factory using the method AddNLog(), it is possible to enable logging scope using NLogProviderOptions.IncludeScopes.

But how to make NLog write logging scope to a file?

I haven't found anything similar in the list of available layouts

Lindbom answered 20/2, 2020 at 17:42 Comment(4)
Does this post help: learn.microsoft.com/en-gb/aspnet/core/fundamentals/logging/…?Treharne
@MikeParkhill unlikely, he asking how to write which scope is being used in the log, not how to use scoped loggingFrank
yeah, that post calls out that it will be included in the log if configured properly - thought it might help them see what they're missingTreharne
If you just want to add an additional logevent property, then this might be of interest: github.com/NLog/NLog.Extensions.Logging/wiki/…Shotton
D
22

An example:

Log like this:

// logger is here of type Microsoft.Extensions.Logging.ILogger
using (logger.BeginScope(new[] { new KeyValuePair<string, object>("userid", request.UserId) }))
{
   logger.LogDebug("My log message");
}

Render like this: ${mdlc:userid}.

For example in the file target:

 <target name="file" xsi:type="File"
     layout="${longdate} ${logger} ${message}${exception:format=ToString}, user: ${mdlc:userid}" 
     fileName="${basedir}/${shortdate}.log" />

Note: NLogProviderOptions.IncludeScopes is enabled by default.

NLog directly

The syntax is a bit clumsy, but that is because Microsoft's abstraction is a bit limited. See also this issue: .NET - Logging structured data without it appearing in the text message

If you refer NLog directly, you could also do:

using (NLog.MappedDiagnosticsLogicalContext.SetScoped("userid", request.UserId))
{
   // logger here of type NLog.Logger
   logger.Info("My log message");
}

Also this is rendered with ${mdlc:userid}

More examples and different scopes for NLog explained here

Docs

PS: I have updated available layouts, so you could find it easier :)

enter image description here

Dishearten answered 20/2, 2020 at 18:49 Comment(4)
It isn't necessary to pass the KeyValuePair array when creating a scope. I'm using template string with params, and it works well. Like this: logger.BeginScope("{userid}", request.UserId)Libidinous
Answer and docs uses different syntax. So its ${mdlc:userid} or ${mdlc:item=userid}?Winker
Both are fine. item is the default for this renderer, so you could skip itDishearten
With NLog 5, MDLC has been replaced by ScopeProperty github.com/NLog/NLog/wiki/ScopeProperty-Layout-RendererEnunciation
P
1

New (in V5) is to use ${scopenested}.

See https://github.com/NLog/NLog/wiki/ScopeNested-Layout-Renderer.

Palliasse answered 2/12, 2022 at 11:58 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.