Поделиться через


CA1873: избегайте потенциально дорогого ведения журнала

Недвижимость Ценность
Идентификатор правила CA1873
Заголовок Избегайте потенциально дорогого ведения журнала
Категория Производительность
Исправление является разрушающим или неразрушающим Non-breaking
Включен по умолчанию в .NET 10 Как предложение

Причина

Во многих ситуациях ведение журнала отключено или установлено на уровень журнала, который приводит к ненужной оценке аргументов ведения журнала.

Описание правила

При вызове методов ведения журнала их аргументы оцениваются независимо от того, включен ли уровень ведения журнала. Это может привести к выполнению дорогостоящих операций, даже если сообщение журнала не будет записано. Для повышения производительности можно защитить дорогостоящие вызовы ведения журнала с помощью проверки IsEnabled или использования LoggerMessage шаблона.

Устранение нарушений

Чтобы устранить нарушение этого правила, используйте один из следующих подходов:

  • Защита вызова ведения журнала с помощью проверки IsEnabled.
  • LoggerMessage Используйте шаблон с LoggerMessageAttribute.
  • Убедитесь, что дорогостоящие операции не выполняются в аргументах ведения журнала, если это не необходимо.

Example

В следующем фрагменте кода показаны нарушения 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

Следующий фрагмент кода исправляет нарушения.

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

Когда следует подавлять предупреждения

Это безопасно для подавления предупреждения из этого правила, если производительность не является проблемой или если аргументы ведения журнала не связаны с дорогостоящими операциями.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".

См. также