Udostępnij za pośrednictwem


CA1848: Używaj delegatów LoggerMessage

Właściwości Wartość
Identyfikator reguły CA1848
Tytuł Użyj delegatów LoggerMessage
Kategoria Wydajność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Używanie metod rozszerzenia rejestratora, takich jak LogInformation i LogDebug.

Opis reguły

W przypadku scenariuszy rejestrowania o wysokiej wydajności należy użyć wzorca LoggerMessage zamiast Logger<T> metod rozszerzeń.

Jak naprawić naruszenia

Użyj LoggerMessageAttribute do naprawienia naruszeń tej reguły. (Jeśli używasz platformy .NET 5 lub starszej, użyj klasy 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!");
   }
}

Poniższy kod naprawia naruszenie.

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 zapewnia następujące korzyści w zakresie wydajności w porównaniu z Logger<T> metodami rozszerzeń:

  • Metody rozszerzające dla rejestratorów wymagają "boxing" (konwertowania) typów wartości, takich jak int, na object. Wzorzec LoggerMessage unika boksowania, korzystając z pól statycznych Action i metod rozszerzeń z silnie typowanymi parametrami.
  • Metody rozszerzenia loggera muszą analizować szablon komunikatu (nazwany ciąg formatu) za każdym razem, gdy zapisano komunikat dziennika. LoggerMessage Wymaga analizowania szablonu tylko raz po zdefiniowaniu komunikatu.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Zobacz też