로깅 및 인터셉션 개요

EF Core(Entity Framework Core)에는 로그를 생성하고, 이벤트에 응답하고, 진단을 얻기 위한 몇 가지 메커니즘이 포함되어 있습니다. 이들 각각의 경우는 다양한 상황에 맞게 맞춤화되며, 여러 메커니즘이 작동할 수 있는 경우에도 현재 작업에 가장 적합한 메커니즘을 선택하는 것이 중요합니다. 예를 들어 데이터베이스 인터셉터를 사용하여 SQL을 로깅할 수 있지만, 로깅에 맞게 조정된 메커니즘 중 하나로 처리하는 것이 더 낫습니다. 이 페이지에서는 해당하는 각 메커니즘의 개요를 제공하고 각 메커니즘을 사용해야 하는 경우를 설명합니다.

빠른 참조

아래 표에서는 여기에 설명된 메커니즘 간의 차이점에 대한 빠른 참조를 제공합니다.

메커니즘 Async Scope 등록됨 올바른 사용법
간단한 로깅 컨텍스트별 컨텍스트 구성 개발 시간 로깅
Microsoft.Extensions.Logging 컨텍스트별* D.I. 또는 컨텍스트 구성 프로덕션 로깅
이벤트 컨텍스트별 항상 EF 이벤트에 대응
인터셉터 Yes 컨텍스트별 컨텍스트 구성 EF 작업 조작
진단 수신기 프로세스 전역적으로 애플리케이션 진단

*일반적으로 Microsoft.Extensions.Logging은(는) 종속성 주입을 통해 애플리케이션별로 구성됩니다. 하지만, EF 레벨에서 각 컨텍스트는 필요시 다른 로거를 통해 구성할 있습니다.

간단한 로깅

EF Core 로그는 DbContext 인스턴스를 구성할 때 LogTo를 사용하여 어떤 유형의 애플리케이션에서도 액세스할 수 있습니다. 이 구성은 일반적으로 DbContext.OnConfiguring의 재정의에서 수행됩니다. 예를 들면 다음과 같습니다.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);

이 개념은 EF6의 Database.Log와 유사합니다.

자세한 내용은 간단한 로깅을 참조하세요.

Microsoft.Extensions.Logging

Microsoft.Extensions.Logging은 여러 일반적인 로깅 시스템을 위한 플러그 인 공급자가 있는 확장 가능한 로깅 메커니즘입니다. EF Core는 Microsoft.Extensions.Logging과 완전히 통합되며 이 형식의 로깅은 기본적으로 ASP.NET Core 애플리케이션에 사용됩니다.

자세한 내용은 EF Core에서 Microsoft.Extensions.Logging 사용을 참조하세요.

이벤트

EF Core는 EF Core 코드에서 특정 작업을 수행하는 경우 콜백을 수행할 .NET 이벤트를 노출합니다. 이벤트는 인터셉터보다 간단하며 더 유연하게 등록할 수 있습니다. 그러나 동기화 전용이므로 비차단 비동기 I/O를 수행할 수 없습니다.

이벤트는 DbContext 인스턴스별로 등록되므로 언제든지 이 등록을 수행할 수 있습니다. 진단 수신기를 사용하여 프로세스의 모든 DbContext 인스턴스에 대해 동일한 정보를 가져옵니다.

자세한 내용은 EF Core의 .NET 이벤트를 참조하세요.

Interception

EF Core 인터셉터를 사용하면 EF Core 작업의 인터셉션, 수정 및/또는 해제할 수 있습니다. 여기에는 명령 실행과 같은 하위 수준 데이터베이스 작업과 SaveChanges 호출 등의 상위 수준 작업이 포함됩니다.

인터셉터는 인터셉트되는 작업을 수정하거나 제거할 수 있다는 점에서 로깅 및 진단과 다릅니다. 간단한 로깅 또는 Microsoft.Extensions.Logging이 로깅에 더 적합합니다.

인터셉터는 컨텍스트가 구성될 때 DbContext 인스턴스별로 등록됩니다. 진단 수신기를 사용하여 프로세스의 모든 DbContext 인스턴스에 대해 동일한 정보를 가져옵니다.

자세한 내용은 인터셉션을 참조하세요.

진단 수신기

진단 수신기를 사용하면 현재 .NET 프로세스에서 발생하는 모든 EF Core 이벤트를 수신할 수 있습니다.

진단 수신기는 단일 DbContext 인스턴스에서 이벤트를 가져오는 데 적합하지 않습니다. EF Core 인터셉터는 컨텍스트별 등록을 통해 동일한 이벤트에 대한 액세스를 제공합니다.

진단 수신기는 로깅용으로 설계되지 않았습니다. 간단한 로깅 또는 Microsoft.Extensions.Logging이 로깅에 더 적합합니다.

자세한 내용은 EF Core에서 진단 수신기 사용을 참조하세요.