Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Harta benda | Nilai |
|---|---|
| Identifikasi Aturan | CA1873 |
| Title | Hindari pengelogan yang berpotensi mahal |
| Kategori | Kinerja |
| Perbaikan bersifat merusak atau tidak merusak | Non-breaking |
| Diaktifkan secara default di .NET 10 | Sebagai saran |
Penyebab
Dalam banyak situasi, pengelogan dinonaktifkan atau diatur ke tingkat log yang menghasilkan evaluasi yang tidak perlu untuk argumen pengelogan.
Deskripsi aturan
Ketika metode pengelogan dipanggil, argumennya dievaluasi terlepas dari apakah tingkat pengelogan diaktifkan. Ini dapat mengakibatkan operasi mahal dijalankan bahkan ketika pesan log tidak akan ditulis. Untuk performa yang lebih baik, jaga panggilan pengelogan mahal dengan cek ke IsEnabled atau gunakan pola.LoggerMessage
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, gunakan salah satu pendekatan berikut:
- Jaga panggilan pengelogan dengan pemeriksaan ke IsEnabled.
-
LoggerMessageGunakan pola dengan LoggerMessageAttribute. - Pastikan operasi yang mahal tidak dilakukan dalam argumen pengelogan kecuali diperlukan.
Example
Cuplikan kode berikut menunjukkan pelanggaran CA1873:
using Microsoft.Extensions.Logging;
class Example
{
private readonly ILogger _logger;
public Example(ILogger<Example> logger)
{
_logger = logger;
}
public void ProcessData(int[] data)
{
// Violation: expensive operation in logging argument.
_logger.LogDebug($"Processing {string.Join(", ", data)} items");
// Violation: object creation in logging argument.
_logger.LogTrace("Data: {Data}", new { Count = data.Length, Items = data });
}
}
Imports Microsoft.Extensions.Logging
Class Example
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of Example))
_logger = logger
End Sub
Public Sub ProcessData(data As Integer())
' Violation: expensive operation in logging argument.
_logger.LogDebug($"Processing {String.Join(", ", data)} items")
' Violation: object creation in logging argument.
_logger.LogTrace("Data: {Data}", New With {.Count = data.Length, .Items = data})
End Sub
End Class
Cuplikan kode berikut memperbaiki pelanggaran:
using Microsoft.Extensions.Logging;
class Example
{
private readonly ILogger _logger;
public Example(ILogger<Example> logger)
{
_logger = logger;
}
public void ProcessData(int[] data)
{
// Fixed: guard with IsEnabled check.
if (_logger.IsEnabled(LogLevel.Debug))
{
_logger.LogDebug($"Processing {string.Join(", ", data)} items");
}
// Fixed: guard with IsEnabled check.
if (_logger.IsEnabled(LogLevel.Trace))
{
_logger.LogTrace("Data: {Data}", new { Count = data.Length, Items = data });
}
}
}
Imports Microsoft.Extensions.Logging
Class Example
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of Example))
_logger = logger
End Sub
Public Sub ProcessData(data As Integer())
' Fixed: guard with IsEnabled check.
If _logger.IsEnabled(LogLevel.Debug) Then
_logger.LogDebug($"Processing {String.Join(", ", data)} items")
End If
' Fixed: guard with IsEnabled check.
If _logger.IsEnabled(LogLevel.Trace) Then
_logger.LogTrace("Data: {Data}", New With {.Count = data.Length, .Items = data})
End If
End Sub
End Class
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini jika performa tidak menjadi perhatian atau jika argumen pengelogan tidak melibatkan operasi yang mahal.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.