Расширяемость NLog - Как добавить пользовательское поле, используя ExtendValues?

Я пытаюсь добавить некоторые пользовательские поля в 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, что логично.

Однако, несмотря на документацию, я не понимаю, как динамически изменить 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 ответ

Решение

Вы можете попробовать один из этих NLog layoutrenderers, чтобы получить текущее имя пользователя:

  • ${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>
Другие вопросы по тегам