Microsoft.Extensions.Logging 은 많은 일반적인 로깅 시스템에 대한 플러그 인 공급자를 사용하는 확장 가능한 로깅 메커니즘입니다. Microsoft에서 제공하는 플러그 인(예: Microsoft.Extensions.Logging.Console) 및 타사 플러그 인(예: Serilog.Extensions.Logging)은 모두 NuGet 패키지로 사용할 수 있습니다.
EF Core("Entity Framework Core")는 Microsoft.Extensions.Logging와 완전히 통합됩니다. 그러나 특히 종속성 주입을 사용하지 않는 애플리케이션의 경우 더 간단한 로그 방법을 위해 간단한 로깅 을 사용하는 것이 좋습니다.
ASP.NET Core 애플리케이션
Microsoft.Extensions.Logging 는 ASP.NET Core 애플리케이션에서 기본적으로 사용됩니다. EF 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(); });
이 싱글톤/글로벌 인스턴스는 다음에 EF Core에 DbContextOptionsBuilder등록되어야 합니다. 다음은 그 예입니다.
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을 반환하는 경우에 특히 그렇습니다.
EF를 활성화하면 이러한 try-catch 블록이 추가되어 더 자세한 오류가 발생합니다. 다음은 그 예입니다.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.EnableDetailedErrors();
특정 메시지에 대한 구성
EF Core ConfigureWarnings API를 사용하면 애플리케이션이 특정 이벤트가 발생할 때 발생하는 작업을 변경할 수 있습니다. 이를 사용하여 다음을 수행할 수 있습니다.
- 이벤트가 기록되는 로그 수준 변경
- 이벤트 로깅 모두 건너뛰기
- 이벤트가 발생할 때 예외를 던집니다.
이벤트의 로그 수준 변경
경우에 따라 이벤트에 대해 미리 정의된 로그 수준을 변경하는 것이 유용할 수 있습니다. 예를 들어, LogLevel.Debug에서 LogLevel.Information까지 두 개의 추가 이벤트를 홍보하는 데 사용할 수 있습니다.
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));
이벤트에 대한 throw
마지막으로, 지정된 이벤트에 대해 EF Core를 throw하도록 구성할 수 있습니다. 이는 경고를 오류로 변경하는 데 특히 유용합니다. (실제로 이것이 ConfigureWarnings 메서드의 원래 목적이었고, 따라서 그렇게 이름이 붙었습니다.) 예를 들어:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));
필터링 및 기타 구성
로그 필터링 및 기타 구성에 대한 지침은 .NET의 로깅 을 참조하세요.
EF Core 로깅 이벤트는 다음 중 하나에 정의됩니다.
- CoreEventId 모든 EF Core 데이터베이스 공급자에 공통적인 이벤트의 경우
- RelationalEventId 모든 관계형 데이터베이스 공급자에 공통적인 이벤트
- 현재 데이터베이스 공급자와 관련된 이벤트에 대한 유사한 클래스입니다. 예를 들어 SqlServerEventId SQL Server 공급자의 경우입니다.
이러한 정의에는 Microsoft.Extensions.Logging에서 사용하는 각 이벤트에 대한 이벤트 ID, 로그 수준 및 범주가 포함되어 있습니다.
.NET