Bagikan melalui


CA1873: Hindari pengelogan yang berpotensi mahal

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 pengelogan yang dihasilkan sumber dengan LoggerMessageAttribute atribut .

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, gunakan salah satu pendekatan berikut:

  • Jaga panggilan pengelogan dengan pemeriksaan ke IsEnabled.
  • Gunakan pengelogan yang dihasilkan sumber dengan LoggerMessageAttribute atribut .
  • Pastikan operasi yang mahal tidak dilakukan dalam argumen pengelogan kecuali diperlukan.

Example

Cuplikan kode berikut menunjukkan pelanggaran CA1873:

class ViolationExample
{
    private readonly ILogger _logger;

    public ViolationExample(ILogger<ViolationExample> 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 });
    }
}
Class ViolationExample
    Private ReadOnly _logger As ILogger

    Public Sub New(logger As ILogger(Of ViolationExample))
        _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 dengan menggunakan pengelogan yang dihasilkan sumber:

partial class FixExample
{
    private readonly ILogger _logger;

    public FixExample(ILogger<FixExample> logger)
    {
        _logger = logger;
    }

    public void ProcessData(int[] data)
    {
        // Fixed: use source-generated logging.
        // The data array is passed directly; no expensive operation executed unless log level is enabled.
        LogProcessingData(data);

        // Fixed: use source-generated logging.
        LogTraceData(data.Length, data);
    }

    [LoggerMessage(Level = LogLevel.Debug, Message = "Processing {Data} items")]
    private partial void LogProcessingData(int[] data);

    [LoggerMessage(Level = LogLevel.Trace, Message = "Data: Count={Count}, Items={Items}")]
    private partial void LogTraceData(int count, int[] items);
}
Partial Class FixExample
    Private ReadOnly _logger As ILogger

    Public Sub New(logger As ILogger(Of FixExample))
        _logger = logger
    End Sub

    Public Sub ProcessData(data As Integer())
        ' Fixed: use source-generated logging.
        ' The data array is passed directly; no expensive operation executed unless log level is enabled.
        LogProcessingData(data)

        ' Fixed: use source-generated logging.
        LogTraceData(data.Length, data)
    End Sub

    <LoggerMessage(Level:=LogLevel.Debug, Message:="Processing {Data} items")>
    Private Partial Sub LogProcessingData(data As Integer())
    End Sub

    <LoggerMessage(Level:=LogLevel.Trace, Message:="Data: Count={Count}, Items={Items}")>
    Private Partial Sub LogTraceData(count As Integer, items As Integer())
    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.

Lihat juga