0

我尝试使用可扩展性向 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}

4

1 回答 1

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>
于 2018-12-14T20:51:11.287 回答