Как мне интерпретировать конфигурацию Serilog в ASP.NET Core 2.1?

Почему-то мне очень трудно понять, что происходит с конфигурацией Serilog. У меня есть веб-API с .NET Core 2.1 и установленным serilog.sink.logstash. Мой стартап имеет:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    var serverURL = Configuration.GetSection("Logging")["logstashServer"];
    var logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .Enrich.WithProperty("Enviroment", env.EnvironmentName)
        .Enrich.WithProperty("ApplicationName", "MyApp")
        .WriteTo.LogstashHttp(serverURL);           

    if (env.IsDevelopment())
    {         
        app.UseDeveloperExceptionPage();
        logger.WriteTo.Console();
    }

    loggerFactory.AddSerilog();

    Log.Logger = logger.CreateLogger();

    app.UseCors("CorsPolicy");
    app.UseMvc();
}

В моих appsettings есть раздел:

"Logging": {
  "logstashServer": "http://192.168.0.6:8101",
  "IncludeScopes": false,
  "Serilog": {
    "MinimumLevel": {
      "Default": "Error",
      "Override": {
        "Microsoft": "Error",
        "Microsoft.AspNetCore.Hosting": "Error",
        "Microsoft.AspNetCore.Mvc": "Error",
        "System": "Error"
      }
    }
  }
}

Независимо от того, что я делаю, я вижу и в консоли, и в logstash, что регистрируется много нежелательной информации, например:

[14:27:54 INF] Выполненный метод действия MyApp.Controllers.LoggerController.Post(MyApp), вернул результат Microsoft.AspNetCore.Mvc.OkResult в 0,0771 мс.
MyApp> [14:27:54 INF] Выполнение HttpStatusCodeResult, установка кода состояния HTTP 200
MyApp> [14:27:54 INF] Выполненное действие MyApp.Controllers.LoggerController.Post(MyApp) в 2.0855ms

и так далее. Почему я вижу их, так как у меня минимальная ошибка уровня?

Ответ 1

Хотя вы добавили конфигурацию в appsettings.json для переопределения уровней регистрации Serilog, вы фактически не передали указанную конфигурацию в Serilog. На самом простом уровне это требует установки пакета Serilog.Settings.Configuration nuget. Как только вы это сделаете, вы можете добавить вызов ReadFrom.Configuration, например:

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(Configuration.GetSection("Logging"))
    .Enrich.FromLogContext()
    // ...

Это все, что вам нужно, чтобы получить конфигурацию в Serilog, но у вас есть другие проблемы с тем, как вы все еще используете ILoggerFactory внутри Configure (это изменилось в ASP.NET Core 2.0). Одной из проблем, которые могут возникнуть для вас, является то, что как поставщик ASP.NET Core Console, так и приемник Serilog Console записывают журналы. Если вам нужна помощь с любым из них, она хорошо документирована в Интернете, но, конечно, вы можете создать дополнительные вопросы о переполнении стека, если это абсолютно необходимо.

Nicholas Blumhardt сообщил о изменениях ведения журнала ASP.NET Core 2.0 - это полезное чтение, которое должно помочь значительно упростить ваш опыт Serilog + ASP.NET Core.

Ответ 2

Что касается установки, настройки и использования Serilog в проекте API .NET Core 2.1, я нашел эту статью очень полезной.

Что касается файла конфигурации, в репозитории Serilog GitHub есть специальная страница о пакете Serilog.Settings.Configuration.