CA1848: LoggerMessage temsilcilerini kullanma

Özellik Değer
Kural Kimliği CA1848
Başlık LoggerMessage temsilcilerini kullanma
Kategori Performans
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Günlükleyici genişletme yöntemlerinin kullanımı, örneğin LogInformation ve LogDebug.

Kural açıklaması

Yüksek performanslı günlük senaryoları için uzantı yöntemleri yerine Logger<T> desenini kullanın.

İhlalleri düzeltme

Bu kuralın ihlallerini düzeltmek için kullanın LoggerMessageAttribute . (.NET 5 veya önceki bir sürümünü kullanıyorsanız, LoggerMessage sınıfını kullanabilirsiniz.)

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

Aşağıdaki kod, ihlali düzeltir.

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 uzantı yöntemlerine göre Logger<T> aşağıdaki performans avantajlarını sağlar:

  • Kayıt defteri uzantısı yöntemleri, int gibi değer türlerini object içine dönüştürmeyi ("boxing") gerektirir. Kalıp, güçlü şekilde yazılan parametrelerle statik Action alanlar ve genişletme yöntemleri kullanarak kutulama yapmaktan kaçınır.
  • Logger uzantı yöntemleri, her mesaj günlüğe yazıldığında ileti şablonunu (adlandırılmış biçim dizesi) ayrıştırmalıdır. LoggerMessage yalnızca ileti tanımlandığında bir kez şablonun ayrıştırılmasını gerektirir.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan uyarıyı bastırmayın.

Ayrıca bkz.