Partilhar via


CA1848: Usar os delegados LoggerMessage

Property valor
ID da regra CA1848
Título Usar os delegados LoggerMessage
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 10 Não

Motivo

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

Descrição da regra

Para cenários de logging de alto desempenho, use o padrão LoggerMessage em vez dos métodos de extensão.

Como corrigir violações

Use LoggerMessageAttribute para corrigir violações desta 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 relação aos Logger<T> métodos de extensão:

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

Quando suprimir avisos

Não suprima um aviso desta regra.

Consulte também