抑制Entity Framework Core中的SQL查询日志记录

85
我有一个控制台 .net core 应用程序,它使用实体框架核心。 该应用程序使用日志框架将内容写入文件和控制台:
 serviceProvider = new ServiceCollection()
        .AddLogging()
        .AddDbContext<DataStoreContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")))
        .BuildServiceProvider();

    //configure console logging
    serviceProvider.GetService<ILoggerFactory>()
        .AddConsole(LogLevel.Debug)
        .AddSerilog();

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .WriteTo.RollingFile(Path.Combine(Directory.GetCurrentDirectory(), "logs/vcibot-{Date}.txt"))
        .WriteTo.RollingFile(Path.Combine(Directory.GetCurrentDirectory(), "logs/vcibot-errors-{Date}.txt"), LogEventLevel.Error)
        .CreateLogger();

    logger = serviceProvider.GetService<ILoggerFactory>()
        .CreateLogger<Program>();

文件输出的最低级别被设为Information。但是,使用这种设置输出也包含了SQL查询,以下是一个示例:

2017-02-06 10:31:38.282 -08:00 [Information] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [f].[BuildIdentifier], [f].[Branch], [f].[BuildDate], [f].[StaticAssetSizeInKb] FROM [FileSizesHistoryEntries] AS [f]

是否有一种方法可以禁用SQL查询日志记录(仅在Debug日志级别中记录)?


我知道这很老,但是你的代码中的Configuration是从哪里得到的? - Jonathan Wood
2
许多 EF Core 日志记录语句应该编码/级别为调试,而不是信息。 - bvj
8个回答

74

如果您使用内置日志记录器,可以在Program.cs中向ILoggingBuilder添加过滤器。

因此,它可能看起来像:

WebHost.CreateDefaultBuilder(args)
    // ...
    .ConfigureLogging((context, logging) => {
        var env = context.HostingEnvironment;
        var config = context.Configuration.GetSection("Logging");
        // ...
        logging.AddConfiguration(config);
        logging.AddConsole();
        // ...
        logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);
    })
    // ...
    .UseStartup<Startup>()
    .Build();

2
如果你想禁用特定类别的所有日志记录,只需将 LogLevel 设置为 LogLevel.Critical + 1 而不是仅设置为 LogLevel.Warning - TorbenJ
7
如果你使用LogLevel.None,它的值为6,因此不会记录日志。 - RX100

69

不知道这个问题是否仍然是一个活跃的问题,但这是我的解决方案,覆盖“Microsoft.EntityFrameworkCore.Database.Command”的最低级别。

 Log.Logger = new LoggerConfiguration()
            .MinimumLevel.ControlledBy(loggingLevelSwitch)
            .MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", Serilog.Events.LogEventLevel.Warning)
            .Enrich.WithProperty("app", environment.ApplicationName)
            .Enrich.FromLogContext()
            .WriteTo.RollingFile($"./Logs/{environment.ApplicationName}")
            .CreateLogger();

你也可以在appconfig.json中进行这个设置。

"Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "[{Timestamp:u}] [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}"
        }
      },
    ],
    "Enrich": [ "FromLogContext", "WithExceptionDetails" ]
  }

1
有没有可能在appsettings文件中指定这个MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command"的设置? - Akmal Salikhov
2
嗨@AkmalSalikhov,请检查我的编辑答案。问候。 - Santiago Robledo
"Microsoft.EntityFrameworkCore.Model": "警告" 对我来说已经完成了。您可以在日志中看到需要覆盖的内容。 - Per G
这是不必要的。您已经将“Microsoft”前缀设置为警告。这应该包括Microsoft.EntityFrameworkCore.Database.Command - Jonathan Wood

65

发现如果按照以下方式修改Logging部分,我将无法看到与SQL查询相关的EF日志消息:

  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Information",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  }

4
禁用SQL命令跟踪,这绝对是最好和最简单的答案。 - emirc
立即生效,停止查看每个选择语句的所有EF日志 - sagar
logging.AddFilter 在 Blazor 服务器项目中对我无效,但这种方法有效。 - shatulsky

17
如果您正在使用默认的Logger,请在appsettings.json(或者appesttings.Development.json开发启动文件)中进行设置。
"Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Warning"        <----
    }
},

将其设置为警告而不是信息


3
那是针对Microsoft Default Logger的,不是Serilog。 - Dekim

8

您想更改Serilog配置,将Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory上下文的最小级别设置为警告或更高。

您可以通过将输出模板设置为类似于[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}的内容找到需要更改的上下文。一旦您知道了上下文,就可以将模板设置回之前的样子。


.Filter.ByExcluding(Matching.FromSource("Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory")) 但不知道如何设置最小级别。 - Andrzej Martyna
1
如果您正在从代码中进行配置,您应该能够执行类似于 new LoggerConfiguration().MinimumLevel.Information().MinimumLevel.Override("Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory", LogEventLevel.Warning) 的操作。我通常会从 Serilog.Settings.Configuration JSON 进行配置:{"Serilog": {"MinimumLevel": {"Default": "Information", "Override": {"Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory": "Warning"}}}} - mdonoughe
这些细节为答案增加了很多实用价值。我已经尝试了代码,它可以正常运行。谢谢!我稍后会尝试JSON配置,毫无疑问,这是首选的方式,因为您可以对日志选项进行外部控制。 - Andrzej Martyna
有一件非常奇怪的事情是,复制粘贴的代码不起作用,直到我发现字符串文字中有一些看不见的字符(我不得不手动输入才能工作;我认为这是堆栈溢出问题?)。 - Andrzej Martyna

4
我在我的一个项目中遇到了这个问题,并注意到除了之前对这个问题的回答之外,还有一些其他需要考虑的事情。
你可以做类似于以下的事情:
    "Logging": {
        "IncludeScopes": true,
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information",
            "Microsoft.EntityFrameworkCore": "Warning" <-- Note that this applies to EF Core, including everything in it.
        }
    }

同样重要的是添加到 ILoggingBuilder 的顺序。

    // This still will log EF messages to the console.
    serviceCollection.AddLogging(builder =>
        builder
            .AddConsole()
            .AddConfiguration(config.GetSection("Logging")));

    // This will apply the configuration to the console logger.
    serviceCollection.AddLogging(builder =>
        builder
            .AddConfiguration(config.GetSection("Logging"))
            .AddConsole());

0
答案对我来说不起作用,然后我找到了这个解决方法:
在你的 Programs.cs 文件中,创建 builder 后,添加以下代码行: builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);

0

首先找到生成 SQL 查询的源上下文。为此,请按照此处所述设置outputTemplate

然后将其添加到LoggerConfiguration中。

.MinimumLevel.Override(<your_source_context>, LogEventLevel.Warning)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接