Compartilhar via


CA1848: Usar os delegados LoggerMessage

Property Valor
ID da regra CA1848
Título Use os delegados LoggerMessage
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 10 Não

Causa

Uso de métodos de extensão do agente, como LogInformation e LogDebug.

Descrição da regra

Para cenários de log de alto desempenho, use o padrão LoggerMessage em vez dos métodos de extensão Logger<T>.

Como corrigir violações

Use LoggerMessageAttribute para corrigir as violações dessa regra. (Ou, se você estiver usando o .NET 5 ou anterior, use a LoggerMessage classe.)

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

O código a seguir corrige a violação.

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 fornece as seguintes vantagens de desempenho em comparação com os métodos de extensão Logger<T>.

  • Métodos de extensão do agente exigem tipos de valor de conversão boxing, como int, em object. O padrão LoggerMessage evita a conversão boxing usando campos Action estáticos e métodos de extensão com parâmetros fortemente tipados.
  • Os métodos de extensão do agente precisam analisar o modelo de mensagem (cadeia de caracteres de formato nomeada) sempre que uma mensagem de log é gravada. LoggerMessage exige apenas a análise de um modelo uma vez quando a mensagem é definida.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Confira também