다음을 통해 공유


CA1848: LoggerMessage 대리자를 사용하십시오.

속성
규칙 ID CA1848
제목 LoggerMessage 대리자를 사용하기
범주 성능
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

로거 확장 메서드 사용(예: 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 필드 및 확장 메서드를 사용하여 박싱을 방지합니다.
  • 로거 확장 메서드는 로그 메시지가 기록될 때마다 메시지 템플릿(명명된 형식 문자열)을 구문 분석해야 합니다. LoggerMessage는 메시지가 정의될 때 템플릿 구문 분석이 한번만 필요합니다.

경고를 표시하지 않는 경우

이 규칙에서 경고를 무시하지 마십시오.

참고하기