ログの記録Logging

ヒント

この記事のサンプルは GitHub で確認できます。You can view this article's sample on GitHub.

ASP.NET Core アプリケーションASP.NET Core applications

EF Core は、またAddDbContext AddDbContextPoolはが使用されるたびに、ASP.NET Core のログメカニズムと自動的に統合されます。EF Core integrates automatically with the logging mechanisms of ASP.NET Core whenever AddDbContext or AddDbContextPool is used. そのため、ASP.NET Core を使用する場合は、 ASP.NET Core のドキュメントで説明されているようにログ記録を構成する必要があります。Therefore, when using ASP.NET Core, logging should be configured as described in the ASP.NET Core documentation.

その他のアプリケーションOther applications

EF Core のログ記録には、それ自体が1つ以上のログプロバイダーで構成された ILoggerFactory が必要です。EF Core logging requires an ILoggerFactory which is itself configured with one or more logging providers. 共通プロバイダーは、次のパッケージに付属しています。Common providers are shipped in the following packages:

適切なパッケージをインストールした後、アプリケーションは Server.loggerfactory のシングルトン/グローバルインスタンスを作成する必要があります。After installing the appropriate package(s), the application should create a singleton/global instance of a LoggerFactory. たとえば、コンソールロガーを使用すると、次のようになります。For example, using the console logger:

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

このシングルトン/グローバルインスタンスは、のDbContextOptionsBuilderEF Core に登録する必要があります。This singleton/global instance should then be registered with EF Core on the DbContextOptionsBuilder. 次に例を示します。For example:

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

警告

アプリケーションでは、コンテキストインスタンスごとに新しい ILoggerFactory インスタンスを作成しないことが非常に重要です。It is very important that applications do not create a new ILoggerFactory instance for each context instance. そうすると、メモリリークが発生し、パフォーマンスが低下します。Doing so will result in a memory leak and poor performance.

ログ記録対象のフィルター処理Filtering what is logged

アプリケーションでは、ILoggerProvider でフィルターを構成することによって、ログ記録の内容を制御できます。The application can control what is logged by configuring a filter on the ILoggerProvider. 次に例を示します。For example:

public static readonly ILoggerFactory MyLoggerFactory
    = LoggerFactory.Create(builder =>
        {
            builder
                .AddFilter((category, level) =>
                    category == DbLoggerCategory.Database.Command.Name
                    && level == LogLevel.Information)
                .AddConsole();
        });

この例では、ログは、メッセージのみを返すようにフィルター処理されています。In this example, the log is filtered to only return messages:

  • ' Microsoft. EntityFrameworkCore. Database. Command ' カテゴリin the 'Microsoft.EntityFrameworkCore.Database.Command' category
  • ' 情報 ' レベルat the 'Information' level

EF Core の場合、logger カテゴリはDbLoggerCategoryクラスで定義されるため、カテゴリを簡単に見つけることができますが、単純な文字列に解決されます。For EF Core, logger categories are defined in the DbLoggerCategory class to make it easy to find categories, but these resolve to simple strings.

基になるログ記録インフラストラクチャの詳細については、 ASP.NET Core のログ記録に関するドキュメントを参照してください。More details on the underlying logging infrastructure can be found in the ASP.NET Core logging documentation.