Udostępnij za pomocą


CA1873: Unikaj potencjalnie kosztownego rejestrowania

Majątek Wartość
Identyfikator reguły CA1873
Tytuł Unikaj potencjalnie kosztownego rejestrowania
Kategoria Wydajność
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone na platformie .NET 10 Jako sugestia

Przyczyna

W wielu sytuacjach rejestrowanie jest wyłączone lub ustawione na poziom dziennika, który powoduje niepotrzebną ocenę argumentów rejestrowania.

Opis reguły

Podczas wywoływanych metod rejestrowania argumenty są oceniane niezależnie od tego, czy poziom rejestrowania jest włączony. Może to spowodować wykonanie kosztownych operacji nawet wtedy, gdy komunikat dziennika nie zostanie zapisany. Aby uzyskać lepszą wydajność, należy chronić IsEnabled kosztowne wywołania rejestrowania za pomocą sprawdzania lub używania LoggerMessage wzorca.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, użyj jednej z następujących metod:

  • Zaczekaj na wywołanie rejestrowania, sprawdzając polecenie IsEnabled.
  • LoggerMessage Użyj wzorca z elementem LoggerMessageAttribute.
  • Upewnij się, że kosztowne operacje nie są wykonywane w argumentach rejestrowania, chyba że jest to konieczne.

Example

Poniższy fragment kodu przedstawia naruszenia 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

Poniższy fragment kodu naprawia naruszenia:

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

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli wydajność nie jest problemem lub jeśli argumenty rejestrowania nie obejmują kosztownych operacji.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz także