Sdílet prostřednictvím


CA1848: Použijte delegáty LoggerMessage

Vlastnost Hodnota
ID pravidla CA1848
Název Použití delegátů LoggerMessage
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 10 No

Příčina

Použití metod rozšíření protokolovacího nástroje, například LogInformation a LogDebug.

Popis pravidla

Pro scénáře protokolování s vysokým výkonem použijte místo rozšiřujících metod vzor Logger<T>.

Jak opravit porušení

Slouží LoggerMessageAttribute k opravě porušení tohoto pravidla. (Nebo pokud používáte .NET 5 nebo starší, použijte LoggerMessage třídu.)

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!");
   }
}

Následující kód opraví porušení předpisů.

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 poskytuje následující výhody výkonu oproti Logger<T> rozšiřujícím metodám:

  • Metody rozšíření protokolovacího nástroje vyžadují "boxing" (převod) hodnotové typy, například int, do object. Vzor LoggerMessage se vyhne boxování pomocí statických Action polí a rozšiřujících metod se silnými parametry.
  • Metody rozšíření protokolovacího nástroje musí analyzovat šablonu zprávy (pojmenovaný formát řetězec) při každém zápisu zprávy protokolu. LoggerMessage Při definování zprávy vyžaduje pouze jednou parsování šablony.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Viz také