【问题标题】:NLog extensibility - How to add custom field using ExtendValues?NLog 可扩展性 - 如何使用 ExtendValues 添加自定义字段?
【发布时间】: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();

然后我使用

将我的日志发送到 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}"

致我的&lt;target&gt;

但是,我仍然不明白如何将自定义值传递给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


【解决方案1】:

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

【讨论】:

  • +1 for ${aspnet-user-identity},这很棒,而且(几乎)是我想要的。但是,我仍然对 LayoutRenderer 有疑问,您能看看我的编辑吗?
  • 认为你需要多研究一下 NLog 布局渲染器。我不知道您打算在${aspnet-user-id} 中返回什么内容,也许可以查看现有布局渲染器的源代码以获取您自己的灵感。更多这里github.com/NLog/NLog/wiki/AspNetRequest-layout-renderer
  • 也许会创建一个新问题,了解如何自定义 ${aspnet-user-identity} 的输出以符合您的要求。
  • @user2687153 现在已经更新了答案,例如如何将${aspnet-user-identity} 的输出作为currentUser-property 传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2017-12-18
  • 2022-09-22
  • 2012-08-17
  • 2021-07-24
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多