Dot-Net-Core

無法將 Serilog 與 .Net Core 3 IHostBuilder 一起使用

  • September 4, 2021

我正在嘗試在 .Net Core 項目中使用 Serilog。我有 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);

我的第二個服務是使用 .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”的服務

$$ MyService.Startup $$’ 在嘗試啟動 ‘MyService.Startup’ 時。

我找到了支持這兩種方法的部落格文章,但這是第二個我覺得更正確但都不起作用的文章。這是它的連結。另一個部落格在這裡

您不必以這種方式實例化 Logger 的實例。相反,您可以使用 LoggerConfiguration 及其建構器方法來創建記錄器。然後,您可以在 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-application

您需要依賴於 Serilog.Extensions.Hosting 才能在 Host builder 上呼叫 UseSerilog。

引用自:https://stackoverflow.com/questions/60130441