【问题标题】:Unable to use Serilog with .Net Core 3 IHostBuilder无法将 Serilog 与 .Net Core 3 IHostBuilder 一起使用
【发布时间】:2020-02-08 19:33:26
【问题描述】:

我正在尝试在 .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:尝试激活“MyService.Startup”时无法解析类型“Microsoft.Extensions.Logging.ILogger`1[MyService.Startup]”的服务。

我找到了支持这两种方法的博客文章,但这是第二个我觉得更正确但都不起作用的文章。这是一个link。另一个博客是here

【问题讨论】:

  • Serilog.Extensions.Hosting 应用于使其可用。

标签: .net-core serilog .net-core-3.1


【解决方案1】:

您不必以这种方式实例化 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。

【讨论】:

  • 我更新了答案。戴美好的一天,庆祝生活!
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 2022-06-25
  • 2021-05-03
  • 2023-03-14
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多