Condividi tramite


CA1873: evitare la registrazione potenzialmente costosa

Proprietà Value
ID della regola CA1873
Titolo Evitare la registrazione potenzialmente costosa
Categoria Prestazioni
La correzione causa un'interruzione o meno Non-breaking
Abilitato per impostazione predefinita in .NET 10 Come suggerimento

Motivo

In molte situazioni, la registrazione è disabilitata o impostata su un livello di log che comporta una valutazione non necessaria per gli argomenti di registrazione.

Descrizione regola

Quando vengono chiamati i metodi di registrazione, i relativi argomenti vengono valutati indipendentemente dal fatto che il livello di registrazione sia abilitato. Ciò può comportare l'esecuzione di operazioni costose anche quando il messaggio di log non verrà scritto. Per prestazioni migliori, proteggere le chiamate di registrazione costose con un controllo o IsEnabled usare il LoggerMessage modello.

Come correggere le violazioni

Per correggere una violazione di questa regola, usare uno degli approcci seguenti:

  • Proteggere la chiamata di registrazione con un controllo a IsEnabled.
  • Usare il LoggerMessage modello con LoggerMessageAttribute.
  • Assicurarsi che le operazioni costose non vengano eseguite negli argomenti di registrazione, a meno che non sia necessario.

Example

Il frammento di codice seguente mostra le violazioni di 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

Il frammento di codice seguente corregge le violazioni:

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

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se le prestazioni non sono un problema o se gli argomenti di registrazione non comportano operazioni costose.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedere anche