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

How to configure logging for SQL for EFCore 2 in ASP.NET 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 扩展方法的文档明确指出:

Sets the ILoggerFactory that will be used to create ILoggerFactory instances for logging done by this context. It is never necessary to call this method since EF can obtain or create a logger factory automatically.

There is no need to call this method when using one of the 'AddDbContext' methods.'AddDbContext' will ensure that the Microsoft.Extensions.Logging.ILoggerFactory used by EF is obtained from the application service provider.

看来我不应该使用它,因此我假设它会自动使用我在此处配置的任何内容:

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

然而事实并非如此。如果我只在此处配置日志记录 'globally',这不会向控制台输出任何内容。

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

我将 .net core 2.1 与 sdk 2.1.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();

注:

我像您一样将数据库上下文添加到 DI,但我不需要此代码:

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