다음을 통해 공유


CA1848: LoggerMessage 대리자 사용

속성
규칙 ID CA1848
제목 LoggerMessage 대리자 사용
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요

원인

로거 확장 메서드 사용(예: LogInformationLogDebug.

규칙 설명

고성능 로깅 시나리오의 경우 확장 메서드 대신 Logger<T> 패턴을 사용합니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하는 데 사용합니다 LoggerMessageAttribute . (또는 .NET 5 이하를 사용하는 경우 클래스를 LoggerMessage 사용합니다.)

public class SomethingDoer
{
   private readonly ILogger _logger;
   public SomethingDoer(ILogger<SomethingDoer> logger)
   {
       _logger = logger;
   }

   public void DoSomething()
   {
       // This call violates CA1848.
       _logger.LogInformation("Did something!");
   }
}

다음 코드는 위반을 해결합니다.

public partial class SomethingDoer
{
   private readonly ILogger _logger;
   public SomethingDoer(ILogger<SomethingDoer> logger)
   {
       _logger = logger;
   }

   public void DoSomething()
   {
       Log_DidSomething();
   }

   [LoggerMessage(Level = LogLevel.Information, Message = "Did something!")]
   private partial void Log_DidSomething();
}

LoggerMessage 는 확장 메서드에 비해 Logger<T> 다음과 같은 성능 이점을 제공합니다.

  • 로거 확장 메서드는 int에 대한 object와 같은 "boxing"(변환) 값 형식이 필요합니다. LoggerMessage 패턴은 강력한 형식의 매개 변수가 있는 정적 Action 필드 및 확장 메서드를 사용하여 boxing을 방지합니다.
  • 로거 확장 메서드는 로그 메시지가 기록될 때마다 메시지 템플릿(명명된 형식 문자열)을 구문 분석해야 합니다. LoggerMessage는 메시지가 정의될 때 템플릿 구문 분석이 한번만 필요합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.

참고 항목