无法配置 Autofac 以在 .NET 6 Web 应用程序中注入 Serilog 作为 ILogger 的实现

Unable to configure Autofac to inject Serilog as implementation of ILogger in .NET 6 web app

我正在努力通过 .NET 6 网络应用程序中的 Autofac 将 Serilog 配置为 ILogger 的实现。

这是我目前所拥有的...

var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json")
                                              .Build();

Log.Logger = new LoggerConfiguration().ReadFrom
                                      .Configuration(configuration)
                                      .CreateBootstrapLogger();

var builder = WebApplication.CreateBuilder(args)
                            .ConfigureKeyVaultAppConfiguration<Program>();

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Host
       .UseServiceProviderFactory(new AutofacServiceProviderFactory())
       .ConfigureContainer<ContainerBuilder>(containerBuilder =>
          {
             void RegisterModules()
             {
                 containerBuilder.RegisterModule<DataAccessModule>();
             }

             void RegisterConfigs()
             {
                 containerBuilder.RegisterAllConfigurationsInAssembly(typeof(PersistenceSettings).Assembly);
             }

             RegisterModules();
             RegisterConfigs();
         })
       .UseSerilog((ctx, lc) => lc.WriteTo.Console()
                                  .ReadFrom.Configuration(ctx.Configuration));

builder.Logging.ClearProviders();
builder.Logging.AddSerilog(Log.Logger);

var app = builder.Build();

app.UseSerilogRequestLogging();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

当我 运行 它...

DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type '[My Class]' can be invoked with the available services and parameters: Cannot resolve parameter 'Microsoft.Extensions.Logging.ILogger logger' of constructor 'Void .ctor(Supertext.Language.Types.PersistenceSettings, Microsoft.Extensions.Logging.ILogger)'.

我可以看到很多其他开发者遇到同样的问题 (, ),但他们的解决方案并没有解决我的问题。

确保你像 ILogger<MyClass> 一样注射 ILogger<T> 而不是普通的 ILogger. 我不认为有配置以注入无类型记录器,因为记录器需要知道它们正在记录的类别(来源 class 是什么)才能创建。 (这不是 Autofac 的东西,那是 .NET Core 日志记录的东西。)

如果您出于某种原因需要提供一个字符串作为类别并手动获取 ILogger,您需要注入 ILoggerFactory 并从那里创建记录器。