1.12.2 日志记录

优质
小牛编辑
146浏览
2023-12-01

提示

你可以在 GitHub 上查阅当前文章涉及的代码样例

ASP.NET Core 应用程序

一旦使用了 AddDbContextAddDbContextPool ,EF Core 就会自动集成 ASP.NET Core 的日志记录机制。因此,当使用 ASP.NET Core 的时候,日志记录的配置与 ASP.NET Core 帮助文档 中所描述的是一致的。

其他应用程序

EF Core 日志记录目前需要一个 ILoggerFactory,其自身配置了一个或多个 ILoggerProvider。通用提供程序是随以下程序包一起发布的:

安装合适的程序包后,应用程序应该创建单一的/全局的 LoggerFactory 实例。例如,使用控制台记录日志:

public static readonly LoggerFactory MyLoggerFactory = new LoggerFactory(new[] {new ConsoleLoggerProvider((_,__) => true,true)});

然后这个单一的/全局的实例应该通过 DbContextOptionsBuilder 注册到 EF Core。例如:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // 不要每次都创建新的 ILoggerFactory 实例
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

警告

应用程序应该避免为每个上下文实例都创建新的 ILoggerFactory 实例,这很重要。否则会导致内存泄露、性能低下。

日志过滤

最简单的日志过滤方法就是在注册 ILoggerProvider 的时候对其进行配置。例如:

public static readonly LoggerFactory MyLoggerFactory
    = new LoggerFactory(new[]
    {
        new ConsoleLoggerProvider((category, level)
            => category == DbLoggerCategory.Database.Command.Name
               && level == LogLevel.Information, true)
    });

在该样例中,过滤后的日志仅包含这样的信息:

  • 属于 Microsoft.EntityFrameworkCore.Database.Command 分类的
  • 等级为 Information

对于 EF Core,日志记录器分类是在 DbLoggerCategory 类型中定义的,主要是为了便于查找分类,但是都解析为简单字符串。

关于底层日志基础设施的详细内容请查看 ASP.NET Core 日志帮助文档