我尝试使用可扩展性向 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
总是有 value test
,这是合乎逻辑的。
但是,尽管有文档,但我不明白如何currentUser
通过当前登录用户的 ID 动态更改值。
我应该创建一种工厂吗?(如果是,怎么做?我对工厂不放心)
我应该改变我的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}
)