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