Запретить ведение журнала 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
.