다음을 통해 공유


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.LoggingASP.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, 로그 수준 및 범주가 포함되어 있습니다.