Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
| Недвижимость | Ценность |
|---|---|
| Идентификатор правила | 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
Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".