.NET Core Serilog Добавить имя пользователя в журналы с помощью обогащения или промежуточного программного обеспечения - PullRequest
0 голосов
/ 02 октября 2018

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

class ThreadIdEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(
                "ThreadId", Thread.CurrentThread.ManagedThreadId));
    }
}

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

Это то, что у меня есть до сих пор:

Промежуточное ПО для получения имени пользователя для текущего пользователя

public class UserNameEnricher 
{
    private readonly RequestDelegate next;

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

    public Task Invoke(HttpContext context)
    {
        LogContext.PushProperty("UserName", context.User.Identity.Name);

        return next(context);
    }
}

Startup.cs

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

Program.cs

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

Однако, несмотря на все этиконфигурации, имена пользователей по-прежнему не отображаются.Чего мне не хватает?

Конфигурация Serilog:

"Serilog": {
    "MinimumLevel": "Information",
    "Override": {
      "Microsoft": "Critical",
    },
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "Server=.\\SQLEXPRESS;Database=App-7661DEE4-C53F-4E49-B140-2AFAA2C85927;Integrated Security=True;Trusted_Connection=True;MultipleActiveResultSets=true;",
          "schemaName": "App",
          "tableName": "EventLogs"
        }
      }
    ]
  },

1 Ответ

0 голосов
/ 03 октября 2018

Для того, чтобы это работало, вам нужно указать outputTemplate.

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

Шаблоны вывода

Вот демонстрационный код, который используется для RollingFile.

var output = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {ActionName} {UserName} {NewLine}{Exception}";

        Log.Logger = new LoggerConfiguration()
               .Enrich.FromLogContext() // Populates a 'User' property on every log entry
               .WriteTo.RollingFile("Logs/app-{Date}.txt",outputTemplate: output)
               .CreateLogger();

Примечание

{UserName} на выходе должно отображаться UserName в LogContext.PushProperty("UserName", context.User.Identity.Name);.

Обновление:

настроить appsetting.json

  "Serilog": {
"MinimumLevel": "Information",
"Override": {
  "Microsoft": "Critical"
},
"WriteTo": [
  {
    "Name": "RollingFile",
    "Args": {
      "pathFormat": "Logs/app-{Date}.txt",
      "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {UserName} {ActionName}  {NewLine} {Exception}"
    }
  }
]
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...