如何在ASP.NET Core 2.0中为EFCore 2配置SQL的日志记录

时间:2018-01-10 07:43:00

标签: asp.net-core-2.0 ef-core-2.0

我知道这听起来像是一个非常愚蠢的问题,但我被困住了。

Entity Framework > Entity Framework Core > Misc > Logging页面(自2016年11月以来偶然没有更新),它会告诉您执行以下操作:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

如果我执行以下操作(将上述内容适用于ConfigureServices方法),我确实会在每个命令运行时将SQL输出提供给控制台/调试控制台:

services.AddDbContext<MyStoreContext>(options =>
{
    options.UseSqlServer(connection);
    options.UseLoggerFactory(new LoggerFactory().AddConsole().AddDebug());
});

然而,UseLoggerFactory扩展方法的文档清楚地说明了:

  

设置将用于创建ILoggerFactory实例的ILoggerFactory   用于由此上下文完成的日志记录永远不必调用此方法   因为EF可以自动获取或创建记录器工厂。

     

使用其中一个时,无需调用此方法   “AddDbContext”methods.'AddDbContext'将确保   获得EF使用的Microsoft.Extensions.Logging.ILoggerFactory   来自应用服务提供商。

所以我似乎不应该使用它,因此我认为它会自动使用我在此配置的任何内容:

services.AddLogging(options =>
{
    options.AddDebug();
    options.AddConsole();
}

但事实并非如此。如果我只在这里配置“全局”记录,则不向控制台输出任何内容。

在ASP.NET Core 2下登录EFCore 2的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我正在使用带有sdk 2.1.1的.net core 2.1,并且可以通过2种不同的数据库提供程序(mysql和oracle)以这种方式工作。

我的文件appsettings.json具有以下配置:

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Debug"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Debug"
      }
    }
  }
}

在Program.cs中,我将其导入

var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true)
    .AddCommandLine(args)
    .Build();

并在构建虚拟主机时将其传递

WebHost.CreateDefaultBuilder()
       .UseConfiguration(config)
       .Build();

注意:

我就像您一样将db上下文添加到DI中,但是我不需要此代码:

services.AddLogging(options =>
 {
    options.AddDebug();
    options.AddConsole();
 }
相关问题