Я работаю над приложением, которое использует. NET Core 3.1 и Entity Framework Core 3.1. У меня есть проект модульного тестирования MSTest, который тестирует уровень доступа к данным, построенный на EF Core. База данных: SQL Сервер 2019 Express Edition.
appsettings. json
{
"EnableSensitiveDataLogging": "False",
"Logging": {
"LogLevel": {
"Default": "Information",
"System": "Debug",
"Microsoft": "Debug",
"Microsoft.EntityFrameworkCore": "Debug"
}
}
}
Создание DbContextOptionsBuilder
Configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", false)
.AddJsonFile("secrets.json", true)
.Build();
var loggerFactory = LoggerFactory.Create(configure => {
configure.AddConsole();
});
bool.TryParse(Configuration["EnableSensitiveDataLogging"] ?? "false",
out bool enableSensitiveDataLogging);
Builder = new DbContextOptionsBuilder()
.UseLoggerFactory(loggerFactory)
.EnableSensitiveDataLogging(enableSensitiveDataLogging);
Когда я запускаю тест, который проверяет создание нового объекта в базе данных, вывод теста показывает только информацию, относящуюся к командам, выполняемым EF Core. Нет подробностей о неявных транзакциях. Ниже представлен выходной журнал:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.1.3 initialized 'CustomerDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (42ms) [Parameters=[@p0='?' (DbType = Int32), @p1='?' (Size = 100), @p2='?' (Size = 100), @p3='?' (Size = 100), @p4='?' (Size = 30), @p5='?' (Size = 100), @p6='?' (DbType = DateTimeOffset), @p7='?' (DbType = DateTimeOffset)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [customer].[addresses] ([country_id], [line_1], [line_2], [line_3], [zip_postalcode], [county_province], [creation_date], [last_modified_date])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7);
SELECT [address_id]
FROM [customer].[addresses]
WHERE @@ROWCOUNT = 1 AND [address_id] = scope_identity();
...
Я изменил LoggerFactory, чтобы явно указать фильтры следующим образом:
var loggerFactory = LoggerFactory.Create(configure => {
configure.AddConsole()
.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Debug)
.AddFilter((category, level) => category == DbLoggerCategory.Database.Transaction.Name && level == LogLevel.Debug);
});
На этот раз, когда я запускаю тот же модульный тест, я вижу информация о транзакции в выходном журнале, но нет информации о введенных командах:
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20209]
Beginning transaction with isolation level 'Unspecified'.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20200]
Began transaction with isolation level 'ReadCommitted'.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20210]
Committing transaction.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20202]
Committing transaction.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20204]
Disposing transaction.
Вопрос - Как настроить фабрику регистратора для отображения информации о транзакции и команде?