Compartir a través de


CA1873: Evitar el registro potencialmente costoso

Propiedad Importancia
Identificador de la regla CA1873
Título Evitar el registro potencialmente costoso
Categoría Rendimiento
La corrección es disruptiva o no disruptiva Non-breaking
Habilitado de forma predeterminada en .NET 10 Como sugerencia

Causa

En muchas situaciones, el registro está deshabilitado o establecido en un nivel de registro que da como resultado una evaluación innecesaria para los argumentos de registro.

Descripción de la regla

Cuando se llama a los métodos de registro, sus argumentos se evalúan independientemente de si el nivel de registro está habilitado. Esto puede dar lugar a que se ejecuten operaciones costosas incluso cuando no se escriba el mensaje de registro. Para mejorar el rendimiento, proteja las llamadas de registro costosas con una comprobación o IsEnabled use el LoggerMessage patrón .

Cómo corregir infracciones

Para corregir una infracción de esta regla, use uno de los métodos siguientes:

  • Proteja la llamada de registro con una comprobación en IsEnabled.
  • Use el LoggerMessage patrón con LoggerMessageAttribute.
  • Asegúrese de que las operaciones costosas no se realizan en argumentos de registro a menos que sea necesario.

Example

En el fragmento de código siguiente se muestran infracciones de 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

El siguiente fragmento de código corrige las infracciones:

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

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si el rendimiento no es un problema o si los argumentos de registro no implican operaciones costosas.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad a none en el archivo de configuración.

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

Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.

Consulte también