Compartilhar via


CA1848: Utilize os delegados LoggerMessage

Propriedade Valor
ID da regra CA1848
Título Use os delegados LoggerMessage
Categoria Desempenho
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Não
Idiomas aplicáveis C# e Visual Basic

Causa

Uso de métodos de extensão do registrador, 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 de logger exigem "boxing" (conversão) de tipos de valor, como int, em object. O padrão LoggerMessage evita o boxeamento 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 parsear 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