Udostępnij przez


CA1848: Użyj delegatów loggerMessage

Właściwości Wartość
Identyfikator reguły CA1848
Tytuł Używanie delegatów loggerMessage
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.

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

Służy LoggerMessageAttribute do naprawiania 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 rozszerzenia rejestratora wymagają typów wartości typu "boxing" (konwertowanie), takich jak int, na object. Wzorzec LoggerMessage unika tworzenia pól statycznych Action i metod rozszerzeń z silnie typinymi parametrami.
  • Metody rozszerzenia rejestratora muszą analizować szablon komunikatu (nazwany ciąg formatu) za każdym razem, gdy jest zapisywany 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ż