【问题标题】:How to enable logging in EF Core 3?如何在 EF Core 3 中启用日志记录?
【发布时间】:2019-10-31 22:12:36
【问题描述】:

我正在使用 Entity Framework Core 3 Preview 5 和 ASP.NET Core 3 Preview 5。在 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

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

【问题讨论】:

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


【解决方案1】:

3.0 RTM 及更高版本的更新:日志级别恢复为信息。查看文档中的filtering what is logged 了解更多详情


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

在任何情况下,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 事件,我们需要将 EF Core 事件的记录级别更改为 TraceDebugappsettings.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.

【讨论】:

【解决方案2】:

日志可能不会发生的另一个关键原因是:AddDbContext() 上的评论具有未提及的依赖关系。

使用其中一种时无需调用此方法 'AddDbContext' 方法。 'AddDbContext' 将确保 EF使用的ILoggerFactory是从应用服务中获取的 提供者。

仅当您的 DbContextDbContextOptions&lt;T&gt; 注入 base 构造函数时才有效。

例如来自Scaffold-DbContext的自动生成的构造函数

public MyDbContext(DbContextOptions<MyDbContext> options) 
   : base(options)
{
}

注入的对象已经设置了 LoggerFactory,所以如果你不这样做,你将不得不在你的 OnConfiguring() 方法中手动设置记录器。

【讨论】:

  • 使用 AddDbContext(); 仍然不起作用
  • 不知道如何回应这种含糊不清的评论。
  • 我试图从选项中获取记录器工厂,但它始终为空。事实证明这并不是真正需要的,然后评论实际上是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多