NLog可扩展性-如何使用ExtendValues添加自定义字段?

时间:2018-12-14 19:28:57

标签: asp.net-mvc nlog extensibility logz.io

我尝试使用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}

1 个答案:

答案 0 :(得分:2)

您可以尝试使用以下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>