Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Majątek | Wartość |
|---|---|
| Identyfikator reguły | CA1873 |
| Tytuł | Unikaj potencjalnie kosztownego rejestrowania |
| Kategoria | Wydajność |
| Poprawka jest przełomowa lub nieprzełomowa | Non-breaking |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
Przyczyna
W wielu sytuacjach rejestrowanie jest wyłączone lub ustawione na poziom dziennika, który powoduje niepotrzebną ocenę argumentów rejestrowania.
Opis reguły
Podczas wywoływanych metod rejestrowania argumenty są oceniane niezależnie od tego, czy poziom rejestrowania jest włączony. Może to spowodować wykonanie kosztownych operacji nawet wtedy, gdy komunikat dziennika nie zostanie zapisany. Aby uzyskać lepszą wydajność, należy chronić IsEnabled kosztowne wywołania rejestrowania za pomocą sprawdzania lub używania rejestrowania wygenerowanego przez źródło za pomocą atrybutu LoggerMessageAttribute .
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, użyj jednej z następujących metod:
- Zaczekaj na wywołanie rejestrowania, sprawdzając polecenie IsEnabled.
- Użyj rejestrowania wygenerowanego przez źródło z atrybutem LoggerMessageAttribute .
- Upewnij się, że kosztowne operacje nie są wykonywane w argumentach rejestrowania, chyba że jest to konieczne.
Example
Poniższy fragment kodu przedstawia naruszenia ca1873:
class ViolationExample
{
private readonly ILogger _logger;
public ViolationExample(ILogger<ViolationExample> 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 });
}
}
Class ViolationExample
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of ViolationExample))
_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
Poniższy fragment kodu naprawia naruszenia przy użyciu rejestrowania wygenerowanego przez źródło:
partial class FixExample
{
private readonly ILogger _logger;
public FixExample(ILogger<FixExample> logger)
{
_logger = logger;
}
public void ProcessData(int[] data)
{
// Fixed: use source-generated logging.
// The data array is passed directly; no expensive operation executed unless log level is enabled.
LogProcessingData(data);
// Fixed: use source-generated logging.
LogTraceData(data.Length, data);
}
[LoggerMessage(Level = LogLevel.Debug, Message = "Processing {Data} items")]
private partial void LogProcessingData(int[] data);
[LoggerMessage(Level = LogLevel.Trace, Message = "Data: Count={Count}, Items={Items}")]
private partial void LogTraceData(int count, int[] items);
}
Partial Class FixExample
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of FixExample))
_logger = logger
End Sub
Public Sub ProcessData(data As Integer())
' Fixed: use source-generated logging.
' The data array is passed directly; no expensive operation executed unless log level is enabled.
LogProcessingData(data)
' Fixed: use source-generated logging.
LogTraceData(data.Length, data)
End Sub
<LoggerMessage(Level:=LogLevel.Debug, Message:="Processing {Data} items")>
Private Partial Sub LogProcessingData(data As Integer())
End Sub
<LoggerMessage(Level:=LogLevel.Trace, Message:="Data: Count={Count}, Items={Items}")>
Private Partial Sub LogTraceData(count As Integer, items As Integer())
End Sub
End Class
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli wydajność nie jest problemem lub jeśli argumenty rejestrowania nie obejmują kosztownych operacji.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.