Запретить ведение журнала SQL запросов в ядре Entity Framework

У меня есть консольное .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>();

Минимальный уровень для выхода файла установлен в Информацию. Но с этим выходом setup также содержатся SQL-запросы, вот пример:

2017-02-06 10: 31: 38.282 -08: 00 [Информация] Выполнено DbCommand (0ms) [Parameters = [], CommandType = 'Text', CommandTimeout = '30 '] SELECT [f]. [BuildIdentifier], [f]. [Branch], [f]. [BuildDate], [f]. [StaticAssetSizeInKb] FROM [FileSizesHistoryEntries] AS [f]

Есть ли способ отключить ведение журналов SQL-запросов (регистрировать их только на уровне журнала отладки)

Ответ 1

Если вы используете встроенный регистратор, вы можете добавить фильтр ILoggingBuilder в Program.cs.

Итак, это может выглядеть так:

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

Не знаю, является ли этот вопрос актуальным, но это мое решение, переопределить минимальный уровень для "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();

Ответ 3

Вы хотите изменить конфигурацию Serilog, чтобы установить минимальный уровень для контекста Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory в Warning или выше.

Вы можете найти контекст, который вам нужно изменить, установив выходной шаблон на что-то вроде [{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}. Как только вы узнаете контекст, вы можете вернуть шаблон обратно к тому, как это было раньше.

Ответ 4

В appsettings.json (или appesttings.Development.json для запуска разработчика):

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

Установите для Warning вместо Information.