NLog 可扩展性 - 如何使用 ExtendValues 添加自定义字段?
NLog extensibility - How to add custom field using ExtendValues?
我尝试使用 extensibility 向 NLog 添加一些自定义字段。
我的 nlog.config
文件的一部分看起来像这样:(为展示而简化)
<nlog>
<extensions>
<add assembly="Logzio.DotNet.NLog"/>
</extensions>
<variable name="currentUser" value="test" />
<targets async="true">
<target name="logzio" type="Logzio" token="myToken">
<contextproperty name="currentUser" layout="${currentUser}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="logzio" />
</rules>
</nlog>
在每个控制器中,我都有类似的东西(我正在使用 ASP.NET MVC5)
private static Logger logger = LogManager.GetCurrentClassLogger();
然后我使用
将我的日志发送到 logzio
logger.Fatal("Something bad happens");
现在,currentUser
始终具有值 test
,这是合乎逻辑的。
然而,尽管有 documentation,我不明白如何通过我当前登录用户的 ID 动态更改 currentUser
值。
我应该创建一种工厂吗? (如果是,怎么样?我对工厂不放心)
我应该更改 logger
变量吗?如果可以,怎么做?
非常欢迎一段代码。
感谢您指出我的错误
编辑
在@Rolf 的回答后,我创建了这个自定义布局渲染器
[LayoutRenderer("custom-layout")]
public class CustomLayoutRenderer : LayoutRenderer
{
public string IdUser { get; set; }
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
logEvent.Properties.Add("currentUser", "HowToPassCustomDataHere?");
builder.Append("test from custom-layout");
}
}
我相应地更改了 nlog.config,添加了
layout="${message} ${custom-layout}"
给我的 <target>
但是,我仍然不明白如何将自定义值传递给 currentUser
。在 logz.io 中,我将 "HowToPassCustomDataHere?" 作为 currentUser
的值。
(顺便说一句,${aspnet-user-identity}
很棒并且工作正常;但是我想了解如何将自定义值传递给我的布局渲染器。在我的例子中,类似于 ${aspnet-user-id}
)
您可以尝试使用这些 NLog 布局渲染器之一来获取当前用户名:
您还可以创建自己的自定义 NLog LayoutRenderer:https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
如何将其提供为 currentUser 的示例:
<target name="logzio" type="Logzio" token="myToken">
<contextproperty name="currentUser" layout="${aspnet-user-identity}" />
</target>
我尝试使用 extensibility 向 NLog 添加一些自定义字段。
我的 nlog.config
文件的一部分看起来像这样:(为展示而简化)
<nlog>
<extensions>
<add assembly="Logzio.DotNet.NLog"/>
</extensions>
<variable name="currentUser" value="test" />
<targets async="true">
<target name="logzio" type="Logzio" token="myToken">
<contextproperty name="currentUser" layout="${currentUser}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="logzio" />
</rules>
</nlog>
在每个控制器中,我都有类似的东西(我正在使用 ASP.NET MVC5)
private static Logger logger = LogManager.GetCurrentClassLogger();
然后我使用
将我的日志发送到 logziologger.Fatal("Something bad happens");
现在,currentUser
始终具有值 test
,这是合乎逻辑的。
然而,尽管有 documentation,我不明白如何通过我当前登录用户的 ID 动态更改 currentUser
值。
我应该创建一种工厂吗? (如果是,怎么样?我对工厂不放心)
我应该更改 logger
变量吗?如果可以,怎么做?
非常欢迎一段代码。
感谢您指出我的错误
编辑
在@Rolf 的回答后,我创建了这个自定义布局渲染器
[LayoutRenderer("custom-layout")]
public class CustomLayoutRenderer : LayoutRenderer
{
public string IdUser { get; set; }
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
logEvent.Properties.Add("currentUser", "HowToPassCustomDataHere?");
builder.Append("test from custom-layout");
}
}
我相应地更改了 nlog.config,添加了
layout="${message} ${custom-layout}"
给我的 <target>
但是,我仍然不明白如何将自定义值传递给 currentUser
。在 logz.io 中,我将 "HowToPassCustomDataHere?" 作为 currentUser
的值。
(顺便说一句,${aspnet-user-identity}
很棒并且工作正常;但是我想了解如何将自定义值传递给我的布局渲染器。在我的例子中,类似于 ${aspnet-user-id}
)
您可以尝试使用这些 NLog 布局渲染器之一来获取当前用户名:
您还可以创建自己的自定义 NLog LayoutRenderer:https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
如何将其提供为 currentUser 的示例:
<target name="logzio" type="Logzio" token="myToken">
<contextproperty name="currentUser" layout="${aspnet-user-identity}" />
</target>