[英]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.