Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Vastgoed | Waarde |
|---|---|
| Regel-ID | CA1873 |
| Titel | Vermijd mogelijk dure logboekregistratie |
| Categorie | prestatie |
| De oplossing veroorzaakt brekende of niet-brekende problemen | Non-breaking |
| Standaard ingeschakeld in .NET 10 | Als suggestie |
Oorzaak
In veel situaties wordt logboekregistratie uitgeschakeld of ingesteld op een logboekniveau dat resulteert in een onnodige evaluatie voor logboekargumenten.
Beschrijving van regel
Wanneer logboekregistratiemethoden worden aangeroepen, worden hun argumenten geëvalueerd, ongeacht of het logboekregistratieniveau is ingeschakeld. Dit kan ertoe leiden dat dure bewerkingen worden uitgevoerd, zelfs wanneer het logboekbericht niet wordt geschreven. Beveilig dure aanroepen voor logboekregistratie met een controle naar IsEnabled of gebruik het LoggerMessage patroon voor betere prestaties.
Hoe schendingen op te lossen
Als u een schending van deze regel wilt oplossen, gebruikt u een van de volgende methoden:
- Beveilig de aanroep van de logboekregistratie met een controle.IsEnabled
- Gebruik het
LoggerMessagepatroon met LoggerMessageAttribute. - Zorg ervoor dat dure bewerkingen niet worden uitgevoerd in logboekargumenten, tenzij dat nodig is.
Example
In het volgende codefragment ziet u schendingen van 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
Met het volgende codefragment worden de schendingen opgelost:
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
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als de prestaties geen probleem zijn of als de logboekargumenten geen dure bewerkingen omvatten.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.