다음을 통해 공유


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 애플리케이션에서 사용됩니다. 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는 예외 메시지에 데이터의 값을 포함하지 않습니다. 이는 해당 데이터가 기밀일 수 있고, 예외 사항이 처리되지 않으면 프로덕션 용도로 공개될 수 있기 때문입니다.

그러나 특히 키의 데이터 값을 아는 것은 디버깅할 때 매우 도움이 될 수 있습니다. EnableSensitiveDataLogging()을 호출하여 EF Core에서 사용하도록 설정할 수 있습니다. 예시:

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를 사용하면 애플리케이션이 특정 이벤트가 발생할 때 나타나는 작업을 변경할 수 있습니다. 이를 사용하여 다음을 수행할 수 있습니다.

  • 이벤트가 기록되는 로그 수준 변경
  • 이벤트 로깅 모두 건너뛰기
  • 이벤트가 발생할 때 예외 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 로깅 이벤트는 다음 중 하나로 정의됩니다.

  • 모든 EF Core 데이터베이스 공급자에 공통적인 이벤트의 경우 CoreEventId
  • 모든 관계형 데이터베이스 공급자에 공통적인 이벤트의 경우 RelationalEventId
  • 현재 데이터베이스 공급자와 관련된 이벤트에 대한 유사한 클래스입니다. 예를 들어 SQL Server 공급자의 경우 SqlServerEventId입니다.

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