无法将 Serilog 与 .Net Core 3 IHostBuilder 一起使用
Unable to use Serilog with .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: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger`1[MyService.Startup]' while attempting to activate 'MyService.Startup'.
我找到了支持任一方法的博文,但我认为第二个方法更正确,但都不起作用。这是一个link to it. The other blog is here.
您不必以这种方式实例化 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 才能在主机构建器上调用 UseSerilog。
我正在尝试在 .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: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger`1[MyService.Startup]' while attempting to activate 'MyService.Startup'.
我找到了支持任一方法的博文,但我认为第二个方法更正确,但都不起作用。这是一个link to it. The other blog is here.
您不必以这种方式实例化 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 才能在主机构建器上调用 UseSerilog。