以前在使用 Microsoft.Extensions.Logging
我会注入 ILoggerFactory
和 .UseLoggingFactory()
当设置我的DbContext时,我的DbContext如下所示(为简洁起见有所减少)。
private readonly ILoggerFactory LoggerFactory;
public Startup(... ILoggerFactory loggerFactory)
{
LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString($"DbDataContext");
services.AddDbContext<OakfieldLeasingDataContext>(
options => options
.UseSqlServer(
connectionString,
x => x.UseNetTopologySuite())
.UseLoggerFactory(LoggerFactory));
}
我现在想换成 Serilog
我已经成功改变了我的 Program.cs
如下图所示。
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.WriteTo.File(new RenderedCompactJsonFormatter(), "./logs/log.ndjson")
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
并能成功确认日志进入日志文件。但是,用现有的代码,我得到了以下错误。
System.InvalidOperationException: 在尝试激活'Blazor.Server.Startup'时,无法解析'Microsoft.Extensions.Logging.ILoggerFactory'类型的服务。
谁能告诉我如何将Serilog LoggerFactory注入EF Core来记录SQL的生成请问?
从3.0开始,你可以注入到Startup的类型是有限制的。这是一个误导性的功能,因为它使用了一个完全独立的DI容器与应用程序的其余部分。你仍然可以注入 ILogger<T>
到你 Configure
方法,而不再是直接进入构造函数或 ConfigureServices
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
在你的dbcontext类中,你可以这样使用。
ILogger<DBContextClass> _logger;
public DBContextClass(ILogger<EngageAPIController> logger)
{
_logger = logger;
}