로거를 사용하여 사용자 지정 로그 메시지 추가

완료됨

.NET은 사용자 지정된 원격 분석 데이터를 기록하는 데 사용할 수 있는 API를 제공합니다. OpenTelemetry는 해당 데이터를 내보낼 수 있습니다.

이 단원에서는 이벤트를 구조화된 로그로 보내는 효율적인 코드를 작성하는 방법을 알아봅니다.

ILogger 개체

.NET Aspire 도구는 템플릿을 기반으로 프로젝트를 만들거나 .NET Aspire 오케스트레이션에 기존 프로젝트를 추가할 때 OpenTelemetry API를 자동으로 설정합니다. 원격 분석을 기록하려는 경우 자체 로깅, 메트릭 또는 추적 개체를 만들 필요가 없습니다. 대신 마이크로 서비스에서 종속성 주입을 사용하여 이를 검색할 수 있습니다.

예를 들어, 다음 BasketService 클래스에서는 ILogger 개체가 클래스 선언에 포함됩니다. 이벤트를 작성하기 위해 클래스 내 어디에서나 해당 로거를 사용할 수 있습니다.

public class BasketService(
    IBasketRepository repository,
    ILogger<BasketService> logger) : Basket.BasketBase
{
    [AllowAnonymous]
    public override async Task<CustomerBasketResponse> GetBasket(
	    GetBasketRequest request, ServerCallContext context)
    {
        var userId = context.GetUserIdentity();

        // Use the logger to write events
        if (logger.IsEnabled(LogLevel.Debug))
        {
            logger.LogDebug("Begin GetBasketById call from method {Method} for basket id {userId}", context.Method, userId);
        }

        var data = await repository.GetBasketAsync(userId);

        return new();
    }
}

효율적인 로깅

로깅은 마이크로 서비스를 관찰 가능하게 만드는 데 도움이 됩니다. 앱을 테스트하고, 준비하고, 프로덕션에 배포할 때 철저한 로그 코드를 통해 오류나 병목 현상을 신속하게 진단할 수 있습니다. 따라서 모든 것을 기록하려고 하는 유혹이 있습니다. 하지만 로깅이 빠르다고 해서 비용이 전혀 들지 않는 것은 아니므로 효율적으로 로깅하도록 주의해야 합니다.

공급업체는 일반적으로 수집하는 데이터의 양을 기준으로 APM(애플리케이션 성능 관리) 시스템에 요금을 청구합니다. 메시지에 적절한 로그 수준과 기본 컬렉션 수준을 선택하면 월별 청구서에 큰 영향을 미칠 수 있습니다. 로그 컬렉션 수준은 일반적으로 ILogger<T>에서 사용되는 형식 이름인 공급자별로 설정할 수 있습니다.

기록할 때마다 다음 기술을 사용합니다.

  • 사용하려는 로깅 수준이 사용하도록 설정되어 있는지 확인합니다. 사용 가능한 수준에는 정보, 경고, 오류 및 위험이 포함됩니다. 관리자는 테스트, 준비 및 프로덕션 배포 시 다양한 수준을 사용하도록 설정할 수 있습니다. 로그 출력은 일반적으로 appsettings.json 또는 환경 변수를 사용하여 IConfiguration을 통해 제어됩니다.
  • 기록된 메시지에 문자열 보간을 방지합니다. 보간된 문자열은 $ 기호로 정의되며 선택한 로깅 수준이 사용하도록 설정되지 않은 경우에도 평가됩니다. 대신, LogInformation() 또는 LogDebug()와 같은 로그 메서드를 사용하고 인수 목록에 매개 변수를 전달합니다.
  • 컴파일 시간 원본 생성을 사용하여 로깅 성능을 더욱 최적화하고 각 로그 메시지에 대한 고유 식별자를 만듭니다. 이는 APM에서 로그 메시지를 쿼리할 때 유용합니다.

컴파일 시간 원본 생성

ILogger 개체를 사용한 컴파일 시간 원본 생성은 각 로깅 요청이 아닌 문자열 분석을 한 번 수행하여 로깅 비용을 줄입니다. 또한 각 로그 메시지 형식에 대한 ID도 포함됩니다. 이 기술을 사용하려면 로깅 매개 변수를 사용하여 부분 로깅 메서드를 정의하고 여기에 LoggerMessageAttribute를 적용합니다. .NET은 코드가 컴파일될 때 자동으로 전체 로깅 방법을 생성합니다.

.NET Aspire에서는 ILogger를 만들 필요가 없지만 대신 종속성 주입을 통해 가져올 수 있다는 점에 유념해야 합니다.

public partial class BasketService(
    IBasketRepository repository,
    ILogger<BasketService> logger) : Basket.BasketBase
{
    [LoggerMessage(
        EventId = 0,
        Level = LogLevel.Information,
        Message = "Obtaining a basket from method {Method} for basket {basketId}")]
    public partial void LogGetBasket(string Method, int basketId);
}

자세한 정보