如何在EF Core 3中启用日志记录?

时间:2019-06-18 09:42:49

标签: c# asp.net-core entity-framework-core

我正在使用Entity Framework Core 3 Preview 5和ASP.NET Core 3 Preview5。在Visual Studio 2019的调试输出窗口中,我没有从EF Core获得任何日志。我阅读了文档,但是之后我更加困惑:

  1. 根据https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder.useloggerfactory?view=efcore-2.1日志记录应自动设置:
  

使用'AddDbContext'方法之一时,无需调用此方法。 “ AddDbContext”将确保从应用程序服务提供商处获得EF使用的ILoggerFactory。

那不是我的经验。

  1. 我尝试通过将ILoggerFactory注入ConfigureServices来启用日志记录(我打算将其传递给DbContextOptionsBuilder.UseLoggerFactory,但是现在已经不可能了,请参见https://github.com/aspnet/Announcements/issues/353 < / li>

那么,如何在EF Core 3.0中设置日志记录到调试输出窗口?谢谢!

2 个答案:

答案 0 :(得分:2)

另一个可能导致无法进行日志记录的关键原因是:对AddDbContext()的注释具有未提及的依赖性。

使用以下任一方法时,无需调用此方法 'AddDbContext'方法。 “ AddDbContext”将确保 EF使用的ILoggerFactory是从应用程序服务获得的 提供者。

仅当您的DbContextDbContextOptions<T>构造函数注入base时,此方法才有效。

例如由Scaffold-DbContext

自动生成的构造函数
public MyDbContext(DbContextOptions<MyDbContext> options) 
   : base(options)
{
}

该注入的对象已经使用LoggerFactory进行了设置,因此,如果您不这样做,则必须在OnConfiguring()方法中手动设置记录器。

答案 1 :(得分:0)

票数接近可能是因为问题中没有代码可以重现该问题。

在任何情况下,EF Core均在调试级别记录日志。通用主机构建器或Web主机构建器使用的默认级别为Information。日志记录级别必须更改为TraceDebug

默认情况下,此代码不会记录任何EF事件:

static async Task Main(string[] args)
{
    var host = Host
        .CreateDefaultBuilder(args)             
        .ConfigureServices((context, services) =>
        {
            var configuration = context.Configuration;
            services.AddDbContext<MyContext>(options =>
                options.UseSqlServer(configuration.GetConnectionString("someConnection")));                    
        })                
        .Build();

    using(var ctx=host.Services.GetRequiredService<MyContext>())
    {
        var cnt=await ctx.Customers.CountAsync();
        Console.WriteLine(cnt);
    }            
}

它只会记录此事件:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
  Entity Framework Core 3.0.0-preview6.19304.10 initialized 'ConsolidatorsContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None

要记录EF事件,我们需要通过Trace或代码将EF Core事件的记录级别更改为Debugappsettings.json。例如,将其包括在appsettings.json中:

    "Logging": {
        "LogLevel": {
            "Microsoft.EntityFrameworkCore":"Debug"
        }
    },

将记录EF事件:

  dbug: Microsoft.EntityFrameworkCore.Infrastructure[10401]
        An 'IServiceProvider' was created for internal use by Entity Framework.
  info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
        Entity Framework Core 3.0.0-preview6.19304.10 initialized 'MyContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
  dbug: Microsoft.EntityFrameworkCore.Database.Connection[20000]
        Opening connection to database 'Customers' on server '10.0.0.216'.
  dbug: Microsoft.EntityFrameworkCore.Database.Connection[20001]
        Opened connection to database 'Customers' on server '10.0.0.216'.
  dbug: Microsoft.EntityFrameworkCore.Database.Command[20100]
        Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
        SELECT COUNT(*)
        FROM [Customers] AS [c]
  dbug: Microsoft.EntityFrameworkCore.Database.Command[20101]
        Executed DbCommand (42ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
        SELECT COUNT(*)
        FROM [Customers] AS [c]
  4
  dbug: Microsoft.EntityFrameworkCore.Database.Command[20300]
        A data reader was disposed.
  dbug: Microsoft.EntityFrameworkCore.Database.Connection[20002]
        Closing connection to database 'Customers' on server '10.0.0.216'.
  dbug: Microsoft.EntityFrameworkCore.Database.Connection[20003]
        Closed connection to database 'Customers' on server '10.0.0.216'.
  dbug: Microsoft.EntityFrameworkCore.Infrastructure[10407]
        'MyContext' disposed.
相关问题