ASP.NET Core Serilog не помещает свойство в свой пользовательский столбец - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть эта настройка в appsettings.json для моей установки Serilog

"Serilog": {
  "MinimumLevel": "Information",
  "Enrich": [ "LogUserName" ],
  "Override": {
    "Microsoft": "Critical"
  },
  "WriteTo": [
    {
      "Name": "MSSqlServer",
      "Args": {
        "connectionString": "Server=.\\SQLEXPRESS;Database=Apple;Trusted_Connection=True;MultipleActiveResultSets=true;,
        "schemaName": "Apple",
        "tableName": "EventLogs",
        "columnOptionsSection": {
          "customColumns": [
            {
              "ColumnName": "UserName",
              "DataType": "nvarchar",
              "DataLength": 256,
              "AllowNull": true
            }
          ]
        }
      }
    }
  ]
},

У меня также есть пользовательское расширение под названием LogUserName, которое должно добавить имя пользователя пользователя в столбец с именем UserName вДБ.

Это обогащение:

public class LogUserName
{
    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);
    }
}

Я добавил .Enrich.FromLogContext() к своему Program.cs.

Пока я могу видеть UserName в теге свойства, но я не могу вставить его в столбец.

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

Я использую эту модель для своих журналов в базе данных:

public class EventLogs
{
    [Key]
    public int Id { get; set; }
    public string Level { get; set; }
    public DateTime TimeStamp { get; set; }
    public string UserName { get; set; }
    public string Properties { get; set; }
    public string LogEvent { get; set; }
    public string Exception { get; set; }
    public string Message { get; set; }
    public string MessageTemplate { get; set; }
}

1 Ответ

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

Ваш обогащатель недействителен.Вы смешиваете две концепции.Добавление свойства в контекст журнала - это не то же самое, что создание фактического обогащения.Фактический обогащатель должен реализовывать ILogEventEnricher, как показано в в этом примере .

То, что вы на самом деле создали, - это промежуточное ПО ASP.NET.LogContext.PushProprety возвращает IDisposable и должен быть заключен в оператор using, а затем все, что находится внутри блока using, должно иметь контекст журнала с дополнительным свойством.Как показано в документации .

Один из способов исправить это - удалить LogUserName из конфигурации вашего обогащения.Затем измените промежуточное программное обеспечение на следующее:

public class LogUserNameMiddleware
{
    private readonly RequestDelegate next;

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

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

Обратите внимание, что вам нужно сообщить ASP.NET Core о промежуточном программном обеспечении, если вы еще этого не сделали.

public static class LogUserNameMiddlewareExtensions
{
    public static IApplicationBuilder UseLogUserNameMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<LogUserNameMiddleware>();
    }
}

и вметод Startup.Configure, вы можете добавить промежуточное ПО в свой конвейер:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseLogUserNameMiddleware();
        //your other middleware
    }
}

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

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