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 布局渲染器之一来获取当前用户名:

  • ${aspnet-user-identity} Wiki
  • ${windows-identity} Wiki

您还可以创建自己的自定义 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>