【问题标题】:Entity Framework Core 3.1 - Log Information About Both Commands and TransactionsEntity Framework Core 3.1 - 关于命令和事务的日志信息
【发布时间】:2020-08-10 19:57:17
【问题描述】:

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

appsettings.json

{ "EnableSensitiveDataLogging": "假", “记录”:{ “日志级别”:{ “默认”:“信息”, “系统”:“调试”, “微软”:“调试”, “Microsoft.EntityFrameworkCore”:“调试” } } }

创建 DbContextOptionsBuilder

配置 = 新的 ConfigurationBuilder() .AddJsonFile("appsettings.json", false) .AddJsonFile("secrets.json", true) 。建造(); var loggerFactory = LoggerFactory.Create(配置 => { 配置.AddConsole(); }); bool.TryParse(Configuration["EnableSensitiveDataLogging"] ?? "false", out bool enableSensitiveDataLogging); 生成器 = 新的 DbContextOptionsBuilder() .UseLoggerFactory(loggerFactory) .EnableSensitiveDataLogging(enableSensitiveDataLogging);

当我运行验证在数据库中创建新实体的测试时,测试输出仅显示与 EF Core 执行的命令相关的信息。没有关于隐式交易的详细信息。以下是输出日志:

信息:Microsoft.EntityFrameworkCore.Infrastructure[10403] Entity Framework Core 3.1.3 使用提供者“Microsoft.EntityFrameworkCore.SqlServer”初始化“CustomerDbContext”,选项:无 信息:Microsoft.EntityFrameworkCore.Database.Command[20101] 执行 DbCommand (42ms) [Parameters=[@p0='?' (DbType = Int32), @p1='?' (大小 = 100),@p2='?' (大小 = 100),@p3='?' (大小 = 100),@p4='?' (大小 = 30),@p5='?' (大小 = 100),@p6='?' (DbType = DateTimeOffset), @p7='?' (DbType = DateTimeOffset)],CommandType='Text',CommandTimeout='30'] 设置无计数; 插入 [customer].[addresses]([country_id]、[line_1]、[line_2]、[line_3]、[zip_postalcode]、[county_province]、[creation_date]、[last_modified_date]) 值(@p0、@p1、@p2、@p3、@p4、@p5、@p6、@p7); 选择 [address_id] FROM [客户].[地址] 其中@@ROWCOUNT = 1 AND [address_id] = scope_identity(); ...

我修改了 LoggerFactory 以明确指定过滤器,如下所示:

var loggerFactory = LoggerFactory.Create(配置 => { 配置.AddConsole() .AddFilter((category, level) => 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] 以“未指定”隔离级别开始事务。 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] 处置交易。

问题 - 如何配置记录器工厂以同时显示事务和命令信息?

【问题讨论】:

    标签: c# logging entity-framework-core


    【解决方案1】:

    在您使用 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 是默认的最低级别(这就是您在原始代码中看到它的原因)。

    【讨论】:

    • 刚刚按照建议进行了更改,一切正常。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2018-05-24
    • 2020-05-17
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多