无法配置 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
并从那里创建记录器。
我正在努力通过 .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
并从那里创建记录器。