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

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

원인

로거 확장 메서드 사용(예: LogInformation 및 LogDebug.

규칙 설명

고성능 로깅 시나리오의 경우 확장 메서드 대신 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는 메시지가 정의될 때 템플릿 구문 분석이 한번만 필요합니다.

경고를 표시하지 않는 경우

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

참고하기