如何使用NLog将日志范围包含到日志文件中

9

我正在使用 NLog.Extensions.Logging

使用方法 AddNLog() 注册日志工厂时,可以通过 NLogProviderOptions.IncludeScopes 启用日志作用域。

但是如何让 NLog 将日志作用域写入文件呢?

我在可用布局列表中没有找到类似的内容。


@MikeParkhill 不太可能,他在询问如何编写日志中使用的作用域,而不是如何使用作用域日志记录。 - TheBatman
是的,那篇帖子指出如果正确配置,它将被包含在日志中 - 我觉得这可能会帮助他们看到他们所缺少的内容。 - Mike Parkhill
如果您只是想添加一个额外的logevent属性,那么这可能会引起兴趣:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-properties-with-Microsoft-Extension-Logging - Rolf Kristensen
2个回答

20

一个例子:

像这样记录日志:

// 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");
}

呈现如下:${mdlc:userid}

例如,在目标文件中:

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

注意:NLogProviderOptions.IncludeScopes默认启用。

NLog直接使用

语法有点笨拙,但这是因为微软的抽象有点有限。另请参阅此问题:.NET - Logging structured data without it appearing in the text message

如果您直接使用NLog,也可以这样做:

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

同时,这个用${mdlc:userid}渲染

更多的例子和不同的范围解释于此处

文档

PS:我已更新可用布局,以便您更轻松地找到 :)

enter image description here


3
创建作用域时不需要传递 KeyValuePair 数组。我正在使用带参数的模板字符串,并且它运行良好。像这样:logger.BeginScope("{userid}", request.UserId) - Vladimir Shiyanov
答案和文档使用不同的语法。所以是 ${mdlc:userid} 还是 ${mdlc:item=userid}? - dimaaan
1
两种方式都可以。item 是此渲染器的默认值,因此您可以跳过它。 - Julian

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接