C# 使用EF Core配置Serilog ASP.Net Core 3.2以记录SQL语句

C# 使用EF Core配置Serilog ASP.Net Core 3.2以记录SQL语句,c#,entity-framework-core,serilog,blazor-server-side,C#,Entity Framework Core,Serilog,Blazor Server Side,以前在使用Microsoft.Extensions.Logging时,我会在设置我的DbContext时插入ILoggerFactory和.UseLoggingFactory(),如下所示(为了简洁起见,减少了) 并且可以成功地确认日志是否将进入日志文件。但是,对于现有代码,我得到以下错误 System.InvalidOperationException:在尝试激活“Blazor.Server.Startup”时,无法解析类型“Microsoft.Extensions.Logging.ILogg

以前在使用
Microsoft.Extensions.Logging
时,我会在设置我的DbContext时插入
ILoggerFactory
.UseLoggingFactory()
,如下所示(为了简洁起见,减少了)

并且可以成功地确认日志是否将进入日志文件。但是,对于现有代码,我得到以下错误

System.InvalidOperationException:在尝试激活“Blazor.Server.Startup”时,无法解析类型“Microsoft.Extensions.Logging.ILoggerFactory”的服务


有人能告诉我如何将Serilog LoggerFactory注入EF Core以记录SQL生成吗

从3.0开始,在启动时可以注入的类型有一个限制。这是一个误导性的特性,因为它使用了与应用程序其余部分完全独立的DI容器。您仍然可以将
ILogger
直接注入到
Configure
方法中,但不再注入构造函数或
ConfigureServices

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
    {
在dbcontext类中,可以这样使用

ILogger<DBContextClass> _logger;
        public DBContextClass(ILogger<EngageAPIController> logger)
        {               
            _logger = logger;
        }
ILogger\u记录器;
公共DBContextClass(ILogger记录器)
{               
_记录器=记录器;
}

从3.0开始,在启动时可以注入的类型有一个限制。这是一个误导性的特性,因为它使用了与应用程序其余部分完全独立的DI容器。您仍然可以将
ILogger
直接注入到
Configure
方法中,但不再注入构造函数或
ConfigureServices

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
    {
在dbcontext类中,可以这样使用

ILogger<DBContextClass> _logger;
        public DBContextClass(ILogger<EngageAPIController> logger)
        {               
            _logger = logger;
        }
ILogger\u记录器;
公共DBContextClass(ILogger记录器)
{               
_记录器=记录器;
}

程序.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .MinimumLevel.Override("Microsoft.EntityFrameworkCore", Serilog.Events.LogEventLevel.Information)
                    .WriteTo.Console(restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Verbose))

Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .MinimumLevel.Override("Microsoft.EntityFrameworkCore", Serilog.Events.LogEventLevel.Information)
                    .WriteTo.Console(restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Verbose))

在3.0中,他们做了一个更改,限制了启动时可以注入的类型。这是一个误导性的特性,因为它使用了与应用程序其余部分完全独立的DI容器。您仍然可以将ILogger直接注入到Configure方法中,但不再注入构造函数或ConfigureServices@viveknuna谢谢你的评论,你能建议我如何注入工厂来记录SQL语句吗?像这样(IApplicationBuilder应用程序、IWebHostEnvironment环境、ILoggerFactory loggerFactory){loggerFactory.AddSerilog()Hmm,好的,但我需要在
ConfigureServices
中添加日志程序,以便在为EF Core配置
DbContext
时添加日志程序?很抱歉,我没有在3.0中获得您的信息,他们已经做了更改,以限制您可以在启动时注入的类型。这是一个误导性的功能,因为它使用了完全独立的DI容器r添加到应用程序的其余部分。您仍然可以直接将ILogger插入到配置方法中,但不再将ILogger插入到构造函数或ConfigureServices@viveknuna谢谢你的评论,你能建议我如何注入工厂来记录SQL语句吗?像这样(IApplicationBuilder应用程序,iWebHostenEnvironment环境,ILoggerFactory loggerFactory){loggerFactory.AddSerilog();Hmm,好的,但我需要在
ConfigureServices
中添加日志,以便在为EF Core配置
DbContext
时添加日志程序?很抱歉,我没有收到您的信息