Microsoft.Extensions.Logging は、多くの一般的なログ システム用のプラグイン プロバイダーを備えた拡張可能なログ記録メカニズムです。 Microsoft が提供するプラグイン ( Microsoft.Extensions.Logging.Console など) とサード パーティ製プラグイン ( Serilog.Extensions.Logging など) はどちらも NuGet パッケージとして使用できます。
Entity Framework Core (EF Core) は、 Microsoft.Extensions.Loggingと完全に統合されます。 ただし、依存関係の挿入を使用しないアプリケーションの場合は、より簡単にログを記録するために単純なログを使用することを検討してください。
ASP.NET Core アプリケーション
Microsoft.Extensions.Logging は、 ASP.NET Core アプリケーションで既定で使用されます。
AddDbContextまたはAddDbContextPoolを呼び出すと、EF Core では、通常の ASP.NET メカニズムを使用して構成されたログ設定が自動的に使用されます。
その他のアプリケーションの種類
他のアプリケーションの種類では、 GenericHost を使用して、ASP.NET Core で使用されているのと同じ依存関係挿入パターンを取得できます。 AddDbContext AddDbContextPoolは、ASP.NET Core アプリケーションと同様に使用できます。
Microsoft.Extensions.Logging は、依存関係の挿入を使用しないアプリケーションにも使用できますが、 単純なログ記録 を設定する方が簡単です。
Microsoft.Extensions.Logging には、 LoggerFactoryの作成が必要です。 このファクトリは、静的/グローバル インスタンスとしてどこかに格納し、DbContext が作成されるたびに使用する必要があります。 たとえば、ロガー ファクトリを静的プロパティとして DbContext に格納するのが一般的です。
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
このシングルトン/グローバル インスタンスは、 DbContextOptionsBuilder上の EF Core に登録する必要があります。 例えば次が挙げられます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
詳細なメッセージの取得
ヒント
AddDbContext が使用されている場合、または DbContextOptions インスタンスが DbContext コンストラクターに渡された場合、OnConfiguring は引き続き呼び出されます。 これにより、DbContext の構築方法に関係なく、コンテキスト構成を適用するのに最適な場所になります。
機微なデータ
既定では、EF Core は例外メッセージにデータの値を含めなくなります。 これは、このようなデータは機密である可能性があり、例外が処理されない場合は運用環境で明らかにされる可能性があるためです。
ただし、特にキーのデータ値を知ることは、デバッグ時に非常に役立ちます。 これを EF Core で有効にするには、 EnableSensitiveDataLogging()を呼び出します。 例えば次が挙げられます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableSensitiveDataLogging();
詳細なクエリ例外
パフォーマンス上の理由から、EF Core は、try-catch ブロック内のデータベース プロバイダーから値を読み取る各呼び出しをラップしません。 ただし、これは、特にデータベースがモデルで許可されていない場合に NULL を返す場合に、診断が困難な例外が発生することがあります。
EnableDetailedErrorsをオンにすると、EF によってこれらの try-catch ブロックが導入され、より詳細なエラー情報が提供されます。 例えば次が挙げられます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
特定のメッセージの構成
EF Core ConfigureWarnings API を使用すると、特定のイベントが発生した場合の動作をアプリケーションで変更できます。 これを使用すると、次のことができます。
- イベントがログに記録されるログ レベルを変更する
- イベントのログ記録をスキップする
- イベントが発生したときに例外をスローする
イベントのログ レベルの変更
イベントの定義済みログ レベルを変更すると便利な場合があります。 たとえば、これを使用して、 LogLevel.Debug から LogLevel.Information に 2 つの追加イベントを昇格させることができます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(
b => b.Log(
(RelationalEventId.ConnectionOpened, LogLevel.Information),
(RelationalEventId.ConnectionClosed, LogLevel.Information)));
イベントのログ記録を抑制する
同様に、個々のイベントをログ記録から抑制できます。 これは、確認および理解された警告を無視する場合に特に便利です。 例えば次が挙げられます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));
イベントを発生させる
最後に、特定のイベントに対してスローするように EF Core を構成できます。 これは、警告をエラーに変更する場合に特に便利です。 (実際のところ、これは ConfigureWarnings メソッドの本来の目的であり、そのためにこの名前が付けられました)。例えば:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
フィルター処理とその他の構成
ログ のフィルター処理とその他の構成に関するガイダンスについては、 .NET でのログ記録を参照してください。
EF Core ログ イベントは、次のいずれかで定義されます。
- CoreEventId すべての EF Core データベース プロバイダーに共通のイベントの場合
- RelationalEventId すべてのリレーショナル データベース プロバイダーに共通のイベントの場合
- 現在のデータベース プロバイダーに固有のイベントに対する同様のクラス。 たとえば、SQL Server プロバイダーのSqlServerEventIdです。
これらの定義には、 Microsoft.Extensions.Loggingで使用される各イベントのイベント ID、ログ レベル、およびカテゴリが含まれます。
.NET