繁体   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