簡體   English   中英

Entity Framework Core 3.1 - 關於命令和事務的日志信息

[英]Entity Framework Core 3.1 - Log Information About Both Commands and Transactions

我正在開發一個使用 .NET Core 3.1 和 Entity Framework Core 3.1 的應用程序。 我有一個 MSTest 單元測試項目,用於測試基於 EF Core 構建的數據訪問層。 數據庫為SQL Server 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);

當我運行驗證在數據庫中創建新實體的測試時,測試 output 僅向我顯示與 EF Core 執行的命令相關的信息。 沒有關於隱式交易的詳細信息。 以下是 output 日志:


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

這次,當我運行相同的單元測試時,我可以在 output 日志中看到事務信息,但沒有關於發出的命令的信息:


    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.

問題 - 如何配置記錄器工廠以同時顯示事務和命令信息?

在您使用AddConfigration之前,您構建的配置對LoggerFactpry.Create調用返回的記錄器工廠沒有影響,例如

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

配置記錄器工廠以顯式顯示事務日志(沒有配置文件)是這樣的

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

連接也是這樣的

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

但通常不需要,因為Information是默認的最低級別(這就是您在原始代碼中看到它的原因)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM