Dela via


CA1873: Undvik potentiellt dyr loggning

Fastighet Värde
Regel-ID CA1873
Titel Undvik potentiellt dyr loggning
Kategori Föreställning
Korrigeringen är antingen brytande eller icke-brytande Non-breaking
Aktiverad som standard i .NET 10 Som förslag

Orsak

I många situationer är loggning inaktiverad eller inställd på en loggnivå som resulterar i en onödig utvärdering för loggningsargument.

Regelbeskrivning

När loggningsmetoder anropas utvärderas deras argument oavsett om loggningsnivån är aktiverad. Detta kan leda till att dyra åtgärder körs även när loggmeddelandet inte skrivs. För bättre prestanda bör du skydda dyra loggningsanrop med en kontroll till IsEnabled eller använda LoggerMessage mönstret.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln använder du någon av följande metoder:

  • Skydda loggningsanropet med en kontroll på IsEnabled.
  • LoggerMessage Använd mönstret med LoggerMessageAttribute.
  • Se till att dyra åtgärder inte utförs i loggningsargument om det inte behövs.

Example

Följande kodfragment visar överträdelser av 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

Följande kodfragment åtgärdar överträdelserna:

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

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om prestanda inte är ett problem eller om loggningsargumenten inte omfattar dyra åtgärder.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även