Dot-Net-Core
無法將 Serilog 與 .Net Core 3 IHostBuilder 一起使用
我正在嘗試在 .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。