CA1848: Gunakan delegasi LoggerMessage

Properti Nilai
ID Aturan CA1848
Judul Menggunakan delegasi LoggerMessage
Kategori Performa
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Penggunaan metode ekstensi logger, seperti LogInformation dan LogDebug.

Deskripsi aturan

Untuk skenario pengelogan berkinerja tinggi, gunakan pola LoggerMessage alih-alih Logger<T> metode ekstensi.

Cara memperbaiki pelanggaran

Gunakan LoggerMessageAttribute untuk memperbaiki pelanggaran aturan ini. (Atau, jika Anda menggunakan .NET 5 atau yang lebih lama, gunakan LoggerMessage kelas .)

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

Kode berikut memperbaiki pelanggaran.

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 memberikan keunggulan performa berikut daripada Logger<T> metode ekstensi:

  • Metode ekstensi pencatat log memerlukan penerapan “boxing” (konversi) untuk jenis nilai, seperti int, menjadi object. Pola menghindari LoggerMessage pengkotakan dengan menggunakan field statis Action dan metode ekstensi dengan parameter bertipe kuat.
  • Metode ekstensi pencatat harus mengurai templat pesan (string format bernama) setiap kali pesan log ditulis. LoggerMessage hanya memerlukan penguraian templat sekali ketika pesan ditentukan.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini.

Lihat juga