【发布时间】:2018-12-14 19:28:57
【问题描述】:
我尝试使用 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})
【问题讨论】:
-
您不应修改 LayoutRenderer 中的 LogEventInfo.Properties。 LayoutRenderer 应该只将所需的上下文信息写入 StringBuilder。
-
这个想法是您初始化 LayoutRenderer 以便能够从某个地方捕获用户名。对于 ASP.NET,可以使用全局 HttpContext。所有这些都在做什么:github.com/NLog/NLog.Web/tree/master/NLog.Web.AspNetCore/…
标签: asp.net-mvc nlog extensibility logz.io