日志记录Logging

提示

可在 GitHub 上查看此文章的示例

ASP.NET Core应用程序ASP.NET Core applications

使用 AddDbContextAddDbContextPool 时,EF Core 会自动与 ASP.NET Core 的日志记录机制集成。 因此,在使用 ASP.NET Core 时,应按ASP.NET Core 文档中所述配置日志记录。

其他应用程序Other applications

EF Core 日志记录要求使用一个或多个日志记录提供程序配置的 ILoggerFactory。 以下包中随附有常见提供程序:

  • “”。控制台:一个简单的控制台记录器。
  • AzureAppServices:支持 Azure 应用服务 “诊断日志” 和 “日志流” 功能。
  • 使用 system.exception ()将日志记录到调试器监视器中的日志记录。
  • 对 Windows 事件日志的日志记录。事件日志。
  • EventListener:支持 EventSource/
  • TraceSource:使用 System.Diagnostics.TraceSource.TraceEvent()将日志记录到跟踪侦听器。

安装适当的包后,应用程序应创建 Server.loggerfactory 的单一实例/全局实例。 例如,使用控制台记录器:

  1. public static readonly ILoggerFactory MyLoggerFactory
  2. = LoggerFactory.Create(builder => { builder.AddConsole(); });

备注

下面的代码示例使用在版本2.2 中已过时的 ConsoleLoggerProvider 构造函数并在3.0 中替换。 使用2.2 时,可以安全地忽略和禁止显示警告。

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

然后,应向 DbContextOptionsBuilder上的 EF Core 注册此单一实例/全局实例。 例如:

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. => optionsBuilder
  3. .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
  4. .UseSqlServer(
  5. @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

警告

应用程序不应为每个上下文实例创建新的 ILoggerFactory 实例,这一点非常重要。 这样做会导致内存泄漏和性能下降。

筛选记录内容Filtering what is logged

应用程序可以通过在 ILoggerProvider 上配置筛选器来控制要记录的内容。 例如:

  1. public static readonly ILoggerFactory MyLoggerFactory
  2. = LoggerFactory.Create(builder =>
  3. {
  4. builder
  5. .AddFilter((category, level) =>
  6. category == DbLoggerCategory.Database.Command.Name
  7. && level == LogLevel.Information)
  8. .AddConsole();
  9. });

备注

下面的代码示例使用在版本2.2 中已过时的 ConsoleLoggerProvider 构造函数并在3.0 中替换。 使用2.2 时,可以安全地忽略和禁止显示警告。

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

在此示例中,将筛选日志以仅返回消息:

  • 在 “Microsoft.entityframeworkcore” 类别中
  • 在 “信息” 级别

对于 EF Core,记录器类别在 DbLoggerCategory 类中定义,以方便查找类别,但这些类别解析为简单字符串。

有关基础日志记录基础结构的更多详细信息,请参阅ASP.NET Core 日志记录文档