我尝试使用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}
)
答案 0 :(得分:2)
您可以尝试使用以下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>