EF Core에서 Microsoft.Extensions.Logging 사용

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");

자세한 메시지 가져오기

AddDbContext를 사용하거나 DbContextOptions 인스턴스가 DbContext 생성자에 전달될 때 OnConfiguring은 여전히 호출됩니다. 따라서 DbContext가 생성되는 방식에 관계없이 컨텍스트 구성을 적용하는 것이 좋습니다.

중요한 데이터

기본적으로 EF Core는 예외 메시지에 데이터의 값을 포함하지 않습니다. 이러한 데이터는 기밀일 수 있으며 예외가 처리되지 않는 경우 프로덕션 사용에서 표시될 수 있기 때문입니다.

그러나 특히 키에 대한 데이터 값을 아는 것은 디버깅할 때 매우 유용할 수 있습니다. 이 기능은 EF Core에서 호출 EnableSensitiveDataLogging()하여 사용하도록 설정할 수 있습니다. 예를 들면 다음과 같습니다.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableSensitiveDataLogging();

자세한 쿼리 예외

성능상의 이유로 EF Core는 try-catch 블록에서 데이터베이스 공급자의 값을 읽는 각 호출을 래핑하지 않습니다. 그러나 이로 인해 진단하기 어려운 예외가 발생하는 경우가 있습니다. 특히 모델에서 허용되지 않는 경우 데이터베이스가 NULL을 반환하는 경우 특히 그렇습니다.

EF를 켜 EnableDetailedErrors 면 이러한 try-catch 블록이 도입되어 더 자세한 오류를 제공합니다. 예를 들면 다음과 같습니다.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableDetailedErrors();

특정 메시지에 대한 구성

EF Core ConfigureWarnings API를 사용하면 애플리케이션이 특정 이벤트가 발생할 때 발생하는 작업을 변경할 수 있습니다. 다음을 수행할 수 있습니다.

  • 이벤트가 기록되는 로그 수준 변경
  • 이벤트 로깅 모두 건너뛰기
  • 이벤트가 발생할 때 예외 throw

이벤트의 로그 수준 변경

경우에 따라 이벤트에 대해 미리 정의된 로그 수준을 변경하는 것이 유용할 수 있습니다. 예를 들어 두 개의 추가 이벤트를 다음으로 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 모든 관계형 데이터베이스 공급자에 공통적인 이벤트의 경우
  • 현재 데이터베이스 공급자와 관련된 이벤트에 대한 유사한 클래스입니다. 예를 들어 SQL Server SqlServerEventId 공급자의 경우입니다.

이러한 정의에는 각 이벤트에 대해 사용되는 Microsoft.Extensions.Logging이벤트 ID, 로그 수준 및 범주가 포함됩니다.