Freigeben über


CA1873: Vermeiden sie potenziell teure Protokollierung

Eigentum Wert
Regel-ID CA1873
Title Vermeiden sie potenziell teure Protokollierung
Kategorie Leistung
Korrektur ist blockierend oder nicht-blockierend Non-breaking
Standardmäßig in .NET 10 aktiviert Als Vorschlag

Ursache

In vielen Situationen ist die Protokollierung deaktiviert oder auf eine Protokollebene festgelegt, die zu einer unnötigen Auswertung für protokollierungsargumente führt.

Regelbeschreibung

Beim Aufrufen von Protokollierungsmethoden werden ihre Argumente unabhängig davon ausgewertet, ob die Protokollierungsebene aktiviert ist. Dies kann dazu führen, dass teure Vorgänge ausgeführt werden, auch wenn die Protokollnachricht nicht geschrieben wird. Um eine bessere Leistung zu erzielen, schützen Sie teure Protokollierungsaufrufe mit einer Überprüfung oder IsEnabled Verwendung des LoggerMessage Musters.

Wie man Verstöße behebt

Verwenden Sie einen der folgenden Ansätze, um einen Verstoß gegen diese Regel zu beheben:

  • Schützen Sie den Protokollierungsaufruf mit einer Überprüfung auf IsEnabled.
  • Verwenden Sie das LoggerMessage Muster mit LoggerMessageAttribute.
  • Stellen Sie sicher, dass teure Vorgänge nicht in Protokollierungsargumenten ausgeführt werden, es sei denn, dies ist erforderlich.

Example

Der folgende Codeausschnitt zeigt Verstöße gegen 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

Der folgende Codeausschnitt behebt die Verletzungen:

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

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung von dieser Regel zu unterdrücken, wenn die Leistung kein Problem ist oder wenn die Protokollierungsargumente keine kostspieligen Vorgänge umfassen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Deaktivieren Sie die Regel für eine Datei, einen Ordner oder ein Projekt, indem Sie den Schweregrad in der none auf setzen.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch