Невозможно использовать Serilog с. Net Core 3 IHostBuilder - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь использовать Serilog в. Net Core проекте. У меня есть 2 службы, первая была обновлена ​​с. Net Core 2.2 и в Program.cs для запуска приложения используется IWebHostBuilder. Здесь я создал свой регистратор и передал его в качестве параметра в UseSerilog (), и все работает как положено.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
        .ConfigureServices(services => services.AddAutofac())
        .UseStartup<Startup>()
        .UseSerilog(_logger);

Моя 2-я служба была создана с использованием шаблонов. Net Core 3 и использует IHostBuilder. Когда я пытаюсь использовать Serilog одним из следующих способов, я получаю ту же ошибку.

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureWebHostDefaults(webBuilder =>
    {
      webBuilder.UseStartup<Startup>()
        .UseSerilog(_logger);
    });

или

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureWebHostDefaults(webBuilder =>
    {
      webBuilder.UseStartup<Startup>();
    })
    .UseSerilog(_logger);

Дает мне эту ошибку

System.InvalidOperationException: невозможно разрешить службу для типа «Microsoft.Extensions.Logging.ILogger`1 [MyService.Startup]» при попытке активировать «MyService.Startup».

Я обнаружил записи в блоге которые поддерживают либо apporach, но это 2-й, который я считаю более правильным, но ни одна из них не работает. Вот ссылка на него. Другой блог здесь .

1 Ответ

2 голосов
/ 09 февраля 2020

Вам не нужно создавать экземпляр экземпляра Logger таким способом. Вместо этого вы можете использовать LoggerConfiguration и методы его построителя для создания регистратора. Затем вы можете инициализировать регистратор stati c в Log.Logger. Вам достаточно вызвать UseSerilog без аргументов.

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .CreateLogger();

        try
        {
            Log.Information("app starting");
            CreateHostBuilder(args).Build().Run();
            Log.Information("app terminated");
        }
        catch (Exception e)
        {
            Log.Fatal("app crashed", e);
        }

    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseSerilog();
}

Основы конфигурации: https://github.com/serilog/serilog/wiki/Configuration-Basics

Настройка нового консольного приложения: https://github.com/serilog/serilog/wiki/Getting-Started#example - применение

...