抑制实体框架核心中的 SQL 查询日志记录

问题描述 投票:0回答:7

我有一个使用实体框架核心的控制台.net核心应用程序。 该应用程序使用日志框架写入文件和控制台:

 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>();

文件输出的最低级别设置为信息。但使用此设置输出还包含 SQL 查询,示例如下:

2017-02-06 10:31:38.282 -08:00 [信息] 执行 DbCommand (0ms) [参数=[],CommandType='文本',CommandTimeout='30'] 选择 [f].[构建标识符]、[f].[分支]、[f].[构建日期]、 [f].[StaticAssetSizeInKb] FROM [FileSizesHistoryEntries] AS [f]

有没有办法禁用 SQL 查询日志记录(仅在调试日志级别记录它们)

entity-framework .net-core serilog
7个回答
72
投票

如果您使用内置记录器,您可以在 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();

60
投票

不知道这是否仍然是一个活跃的问题,但这是我的解决方案,覆盖“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" ]
  }

51
投票

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

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

16
投票

如果您使用默认 Logger,请在

appsettings.json
(或用于开发启动的
appesttings.Development.json
)文件中:

"Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Warning"        <----
    }
},

将其设置为

Warning
而不是
Information


8
投票

您想要更改 Serilog 配置以将

Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory
上下文的最低级别设置为
Warning
或更高。

您可以通过将输出模板设置为

[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}
之类的内容来找到需要更改的上下文。了解上下文后,您可以将模板设置回之前的状态。


0
投票

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

然后在LoggerConfiguration中添加

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

0
投票

这些答案对我不起作用,然后我找到了这个:

在您的 Programs.cs 上,创建构建器,添加该行:

builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);

© www.soinside.com 2019 - 2024. All rights reserved.