Aracılığıyla paylaş


CA1873: Pahalı olabilecek günlük kaydından kaçının

Mülkiyet Değer
Kural Kimliği CA1873
Başlık Pahalı olabilecek günlük kaydından kaçının
Kategori Performans
Düzeltme kırılgan mı yoksa sağlam mı Non-breaking
.NET 10'da varsayılan olarak etkin Öneri olarak

Nedeni

Birçok durumda, günlük devre dışı bırakılır veya günlük bağımsız değişkenleri için gereksiz bir değerlendirmeye neden olan bir günlük düzeyine ayarlanır.

Kural açıklaması

Günlüğe kaydetme yöntemleri çağrıldığında, günlük düzeyinin etkinleştirilip etkinleştirilmediğine bakılmaksızın bağımsız değişkenleri değerlendirilir. Bu, günlük iletisi yazılmasa bile pahalı işlemlerin yürütülmesine neden olabilir. Daha iyi performans için, pahalı günlük çağrılarını bir denetimle IsEnabled koruma veya deseni LoggerMessage kullanma.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için aşağıdaki yaklaşımlardan birini kullanın:

  • günlük aramasını için bir denetimle korur IsEnabled.
  • desenini LoggerMessage ile LoggerMessageAttributekullanın.
  • Gerekli olmadıkça günlük bağımsız değişkenlerinde pahalı işlemlerin gerçekleştirilmediğine emin olun.

Example

Aşağıdaki kod parçacığı CA1873 ihlallerini gösterir:

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

Aşağıdaki kod parçacığı ihlalleri düzeltir:

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

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

Performans önemli değilse veya günlük bağımsız değişkenleri pahalı işlemler içermiyorsa, bu kuraldan gelen bir uyarıyı engellemek güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, none önem derecesini olarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none

Daha fazla bilgi için bkz. Kod analizi uyarılarını gizleme.

Ayrıca bakınız