Имя пользователя .NET Core Serilog всегда равно нулю - PullRequest
0 голосов
/ 20 декабря 2018

Я добавил это промежуточное ПО для добавления имен пользователей в мою регистрацию, однако оно всегда отображается как ноль.

Это промежуточное ПО

private readonly RequestDelegate next;

    public LogUserName(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        LogContext.PushProperty("UserName", context.User.Identity.Name);
        await next(context);
        //return next(context);
    }

Я вызываю его в Program.cs иStartup.cs как этот

Program.cs

Log.Logger = new LoggerConfiguration()
 .ReadFrom.Configuration(Configuration)
 .Enrich.FromLogContext()
 .Filter.ByExcluding(Matching.FromSource("Microsoft"))
 .Filter.ByExcluding(Matching.FromSource("System"))
 .CreateLogger();

Startup.cs

  app.UseAuthentication();
  app.UseMiddleware<LogUserName>();

Я заметил, что когда я жестко закодировал свойство, оно появилось бы в моем журналепод тегом свойств.Например,

LogContext.PushProperty("UserName", "Test");

<properties><property key='SourceContext'>AAAA.Areas.Identity.Pages.Account.LoginModel</property><property key='ActionId'>e477aa96-f0b5-4790-9253-80fcbc72fbda</property><property key='ActionName'>/Account/Login</property><property key='RequestId'>0HLJ6EBJ4V6PP:00000002</property><property key='RequestPath'>/Identity/Account/Login</property><property key='CorrelationId'></property><property key='ConnectionId'>0HLJ6EBJ4V6PP</property><property key='UserName'>Test</property></properties>

Кроме того, я хотел бы вывести его из тега свойств и в его собственное поле, если это возможно.

1 Ответ

0 голосов
/ 20 декабря 2018

Я заметил, что когда я жестко закодировал свойство, оно появилось в моем журнале под тегом свойств.Например, LogContext.PushProperty("UserName", "Test")

<properties>
    <property key='UserName'>Test</property>
</properties>

Кроме того, я хотел бы вывести его из тега свойств и по возможности в его собственное поле.

Приемник MSSqlServer для Serilog по умолчаниюпомещает дополнительные свойства в столбец Properties в формате XML.Однако существует способ настроить столбцы пользовательских свойств для перемещения определенных свойств в его собственные свойства.Вы можете настроить это, используя код, но поскольку вы используете конфигурацию на основе JSON в appsettings.json, вы также можете сделать это там.

Конфигурация должна выглядеть примерно так (сокращеннаяздесь конфигурация для отображения только соответствующих частей):

"Serilog": {
  "WriteTo": [
    {
      "Name": "MSSqlServer",
      "Args": {
        "connectionString": "…",
        "schemaName": "AnalyticsStudio",
        "tableName": "EventLogs",
        "columnOptionsSection": {
          "additionalColumns": [
            { "ColumnName": "UserName" }
          ]
        }
      }
    }
  ]
}

Столбец по умолчанию настроен как varchar, поэтому он должен работать для вашего строкового значения.


Длядля правильного заполнения пользовательского свойства см. следующие вопросы:


Кирк Ларкин предложил следующее в чате:

Из вашего объяснения до сих пор мне интересно, ожидаете ли вы увидеть UserName в сообщении, которое регистрируется как часть того же запроса, который на самом делеподписывает вас. Если выожидая этого, этого не произойдет, потому что вызов LogContext.PushProperty происходит до вашего вызова на что-то вроде PasswordSignInAsync (при условии, что вы используете Identity).

Если это действительно вашВ таком случае вы должны знать, что ваше промежуточное ПО, которое устанавливает настраиваемое свойство, работает до того, как запустит любую логику вашего контроллера.Таким образом, настраиваемое свойство устанавливается до завершения входа в систему, и поэтому во время работы промежуточного программного обеспечения в качестве настраиваемого свойства добавляется пустое имя пользователя.Так что поведение совершенно правильно.Только для последующих запросов промежуточное ПО аутентификации сможет аутентифицировать пользователя до того, как ваше промежуточное ПО запустится, так что вы должны увидеть правильное имя пользователя в выходных данных журнала.

На самом деле нетхороший способ обойти это.Конечно, вы могли бы явно установить пользовательское свойство снова при входе пользователя в систему. Но я бы рекомендовал вам не делать этого, поскольку технически запрос по-прежнему вызывался без какой-либо аутентификации, поэтому не должно быть проблемой не иметь там имя пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...