Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心3.1-记录有关命令和事务的信息_C#_Logging_Entity Framework Core - Fatal编程技术网

C# 实体框架核心3.1-记录有关命令和事务的信息

C# 实体框架核心3.1-记录有关命令和事务的信息,c#,logging,entity-framework-core,C#,Logging,Entity Framework Core,我正在开发一个使用.NET Core 3.1和Entity Framework Core 3.1的应用程序。我有一个MSTest单元测试项目,它测试基于EF核心构建的数据访问层。数据库是SQL Server 2019 Express Edition appsettings.json { “EnableSensitiveDataLogging”:“False”, “日志记录”:{ “日志级别”:{ “默认值”:“信息”, “系统”:“调试”, “Microsoft”:“调试”, Microsoft

我正在开发一个使用.NET Core 3.1和Entity Framework Core 3.1的应用程序。我有一个MSTest单元测试项目,它测试基于EF核心构建的数据访问层。数据库是SQL Server 2019 Express Edition

appsettings.json

{ “EnableSensitiveDataLogging”:“False”, “日志记录”:{ “日志级别”:{ “默认值”:“信息”, “系统”:“调试”, “Microsoft”:“调试”, Microsoft.EntityFrameworkCore:“调试” } } } 创建DbContextOptionsBuilder

配置=新的ConfigurationBuilder() .AddJsonFile(“appsettings.json”,false) .AddJsonFile(“secrets.json”,true) .Build(); var loggerFactory=loggerFactory.Create(configure=>{ configure.AddConsole(); }); bool.TryParse(配置[“EnableSensiveDatalogging”]?“false”, 外边界启用敏感跟踪); Builder=new DbContextOptionsBuilder() .UseLoggerFactory(loggerFactory) .EnableSensitiveAtalogging(EnableSensitiveAtalogging); 当我运行验证在数据库中创建新实体的测试时,测试输出仅显示与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(); ... 信息:Microsoft.EntityFrameworkCore.Infrastructure[10403] 实体框架核心3.1.3使用提供程序“Microsoft.EntityFrameworkCore.SqlServer”初始化了“CustomerDbContext”,选项为:无 信息:Microsoft.EntityFrameworkCore.Database.Command[20101] 执行的DbCommand(42ms)[参数=[@p0='?'(DbType=Int32),@p1='?'(大小=100),@p2='?'(大小=100),@p3='?'(大小=100),@p4='?'(大小=30),@p5='?'(大小=100),@p6='?'(DbType=DateTimeOffset),@p7='?'(DbType=DateTimeOffset)],CommandType='Text',CommandTimeout='30'] 不计数; 插入[客户].[地址]([国家/地区id],[第1行],[第2行],[第3行],[邮政编码],[县/省],[创建日期],[上次修改日期]) 数值(@p0、@p1、@p2、@p3、@p4、@p5、@p6、@p7); 选择[地址\标识] 来自[客户][地址] 其中@@ROWCOUNT=1和[address\u id]=scope\u 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); }); var loggerFactory=loggerFactory.Create(configure=>{ configure.AddConsole() .AddFilter((类别,级别)=>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. dbug:Microsoft.EntityFrameworkCore.Database.Transaction[20209] 正在开始隔离级别为“未指定”的事务。 dbug:Microsoft.EntityFrameworkCore.Database.Transaction[20200] 已开始隔离级别为“ReadCommitted”的事务。 dbug:Microsoft.EntityFrameworkCore.Database.Transaction[20210] 提交事务。 dbug:Microsoft.EntityFrameworkCore.Database.Transaction[20202] 提交事务。 dbug:Microsoft.EntityFrameworkCore.Database.Transaction[20204] 处理交易。
问题-如何配置记录器工厂以同时显示事务和命令信息?

您构建的配置对LoggerFactpry返回的记录器工厂没有影响。在使用之前,请创建调用,例如

将记录器工厂配置为显式显示事务日志(无配置文件)如下所示

configure.AddFilter(DbLoggerCategory.Database.Transaction.Name, LogLevel.Debug);
configure.AddFilter(DbLoggerCategory.Database.Connection.Name, LogLevel.Information);
连接也是这样的

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

但是通常不需要,因为
信息
是默认的最低级别(这就是为什么您在原始代码中看到它)

只是按照建议做了更改,一切正常。谢谢。
configure.AddFilter(DbLoggerCategory.Database.Connection.Name, LogLevel.Information);