Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigentum | Wert |
|---|---|
| Regel-ID | CA1873 |
| Title | Vermeiden sie potenziell teure Protokollierung |
| Kategorie | Leistung |
| Korrektur ist blockierend oder nicht-blockierend | Non-breaking |
| Standardmäßig in .NET 10 aktiviert | Als Vorschlag |
Ursache
In vielen Situationen ist die Protokollierung deaktiviert oder auf eine Protokollebene festgelegt, die zu einer unnötigen Auswertung für protokollierungsargumente führt.
Regelbeschreibung
Beim Aufrufen von Protokollierungsmethoden werden ihre Argumente unabhängig davon ausgewertet, ob die Protokollierungsebene aktiviert ist. Dies kann dazu führen, dass teure Vorgänge ausgeführt werden, auch wenn die Protokollnachricht nicht geschrieben wird. Um eine bessere Leistung zu erzielen, schützen Sie teure Protokollierungsaufrufe mit einer Überprüfung oder IsEnabled Verwendung des LoggerMessage Musters.
Wie man Verstöße behebt
Verwenden Sie einen der folgenden Ansätze, um einen Verstoß gegen diese Regel zu beheben:
- Schützen Sie den Protokollierungsaufruf mit einer Überprüfung auf IsEnabled.
- Verwenden Sie das
LoggerMessageMuster mit LoggerMessageAttribute. - Stellen Sie sicher, dass teure Vorgänge nicht in Protokollierungsargumenten ausgeführt werden, es sei denn, dies ist erforderlich.
Example
Der folgende Codeausschnitt zeigt Verstöße gegen 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
Der folgende Codeausschnitt behebt die Verletzungen:
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
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, eine Warnung von dieser Regel zu unterdrücken, wenn die Leistung kein Problem ist oder wenn die Protokollierungsargumente keine kostspieligen Vorgänge umfassen.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Deaktivieren Sie die Regel für eine Datei, einen Ordner oder ein Projekt, indem Sie den Schweregrad in der none auf setzen.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.