Sdílet prostřednictvím


CA1873: Vyhněte se potenciálně nákladnému protokolování

Vlastnictví Hodnota
Identifikátor pravidla CA1873
Titul Vyhněte se potenciálně nákladnému protokolování
Kategorie výkon
Oprava je destruktivní nebo nedestruktivní Non-breaking
Povoleno ve výchozím nastavení v .NET 10 Jako návrh

Příčina

V mnoha situacích je protokolování zakázané nebo nastavené na úroveň protokolu, která vede k zbytečnému vyhodnocení argumentů protokolování.

Popis pravidla

Při zavolání metod protokolování se jejich argumenty vyhodnocují bez ohledu na to, jestli je povolená úroveň protokolování. To může vést k nákladovým operacím, a to i v případě, že se zpráva protokolu nezapíše. Pokud chcete dosáhnout lepšího výkonu, chraňte nákladné volání protokolování pomocí kontroly IsEnabled nebo použití LoggerMessage vzoru.

Jak opravit porušení

Pokud chcete opravit porušení tohoto pravidla, použijte jeden z následujících přístupů:

  • Hlídejte protokolovací hovor pomocí kontroly IsEnabled.
  • LoggerMessage Použijte vzor s LoggerMessageAttribute.
  • Zajistěte, aby se v argumentech protokolování neprováděly nákladné operace, pokud to není nutné.

Example

Následující fragment kódu ukazuje porušení 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

Následující fragment kódu opravuje porušení:

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

Kdy potlačit upozornění

Pokud výkon není problém nebo pokud argumenty protokolování nezahrnují nákladné operace, je bezpečné potlačit upozornění z tohoto pravidla.

Potlačte upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Chcete-li pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost na none v konfiguračním souboru .

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také