Dela via


CA1848: Använd LoggerMessage-ombuden

Egenskap Värde
Regel-ID CA1848
Title Använd LoggerMessage-delegaterna
Kategori Prestanda
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

Användning av loggertilläggsmetoder, till exempel LogInformation och LogDebug.

Regelbeskrivning

För loggningsscenarier med höga prestanda använder du LoggerMessage-mönstret i stället Logger<T> för tilläggsmetoder.

Så här åtgärdar du överträdelser

Använd LoggerMessageAttribute för att åtgärda överträdelser av den här regeln. (Om du använder .NET 5 eller tidigare, använd klassen 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!");
   }
}

Följande kod åtgärdar överträdelsen.

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 ger följande prestandafördelar jämfört Logger<T> med tilläggsmetoder:

  • Logger-tilläggsmetoder kräver "boxning" (konvertering) av värdetyper, såsom int, till object. Mönstret LoggerMessage undviker boxning genom att använda statiska Action fält och tilläggsmetoder med starkt typade parametrar.
  • Inloggningstilläggsmetoder måste parsa meddelandemallen (namngiven formatsträng) varje gång ett loggmeddelande skrivs. LoggerMessage kräver bara parsning av en mall en gång när meddelandet har definierats.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Se även