Entity Framework Core 3.1 - информация журнала о командах и транзакциях - PullRequest
2 голосов
/ 27 апреля 2020

Я работаю над приложением, которое использует. 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.

Вопрос - Как настроить фабрику регистратора для отображения информации о транзакции и команде?

1 Ответ

1 голос
/ 27 апреля 2020

Созданная вами конфигурация не влияет на фабрику регистратора, возвращаемую вызовом LoggerFactpry.Create, пока вы не используете AddConfigration , например,

configure.AddConfiguration(Configuration.GetSection("Logging"));

Настройка фабрики регистратора для отображения журнал транзакций в явном виде (без файлов конфигурации) выглядит следующим образом

configure.AddFilter(DbLoggerCategory.Database.Transaction.Name, LogLevel.Debug);

То же самое для подключения, он выглядит так

configure.AddFilter(DbLoggerCategory.Database.Connection.Name, LogLevel.Information);

, но обычно не требуется, поскольку Information является значением по умолчанию минимальный уровень (вот почему вы видите его с вашим оригинальным кодом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...