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

Я пытаюсь добавить некоторые пользовательские поля в NLog, используя extensibility .

Часть моего 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?Если да, то как?

Кусок кода будет крайне желателен.

Спасибо, что указали мне, где я ошибаюсь

РЕДАКТИРОВАТЬ

После ответа @ Рольфа я создал этот пользовательский рендерер макетов

[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 голосов
/ 14 декабря 2018

Вы можете попробовать один из этих макетов 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>
...