Delen via


CA1873: Vermijd mogelijk dure logboekregistratie

Vastgoed Waarde
Regel-ID CA1873
Titel Vermijd mogelijk dure logboekregistratie
Categorie prestatie
De oplossing veroorzaakt brekende of niet-brekende problemen Non-breaking
Standaard ingeschakeld in .NET 10 Als suggestie

Oorzaak

In veel situaties wordt logboekregistratie uitgeschakeld of ingesteld op een logboekniveau dat resulteert in een onnodige evaluatie voor logboekargumenten.

Beschrijving van regel

Wanneer logboekregistratiemethoden worden aangeroepen, worden hun argumenten geëvalueerd, ongeacht of het logboekregistratieniveau is ingeschakeld. Dit kan ertoe leiden dat dure bewerkingen worden uitgevoerd, zelfs wanneer het logboekbericht niet wordt geschreven. Beveilig dure aanroepen voor logboekregistratie met een controle naar IsEnabled of gebruik het LoggerMessage patroon voor betere prestaties.

Hoe schendingen op te lossen

Als u een schending van deze regel wilt oplossen, gebruikt u een van de volgende methoden:

  • Beveilig de aanroep van de logboekregistratie met een controle.IsEnabled
  • Gebruik het LoggerMessage patroon met LoggerMessageAttribute.
  • Zorg ervoor dat dure bewerkingen niet worden uitgevoerd in logboekargumenten, tenzij dat nodig is.

Example

In het volgende codefragment ziet u schendingen van 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

Met het volgende codefragment worden de schendingen opgelost:

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

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als de prestaties geen probleem zijn of als de logboekargumenten geen dure bewerkingen omvatten.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Zie ook