Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Fastighet | Värde |
|---|---|
| Regel-ID | CA1873 |
| Titel | Undvik potentiellt dyr loggning |
| Kategori | Föreställning |
| Korrigeringen är antingen brytande eller icke-brytande | Non-breaking |
| Aktiverad som standard i .NET 10 | Som förslag |
Orsak
I många situationer är loggning inaktiverad eller inställd på en loggnivå som resulterar i en onödig utvärdering för loggningsargument.
Regelbeskrivning
När loggningsmetoder anropas utvärderas deras argument oavsett om loggningsnivån är aktiverad. Detta kan leda till att dyra åtgärder körs även när loggmeddelandet inte skrivs. För bättre prestanda bör du skydda dyra loggningsanrop med en kontroll till IsEnabled eller använda LoggerMessage mönstret.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln använder du någon av följande metoder:
- Skydda loggningsanropet med en kontroll på IsEnabled.
-
LoggerMessageAnvänd mönstret med LoggerMessageAttribute. - Se till att dyra åtgärder inte utförs i loggningsargument om det inte behövs.
Example
Följande kodfragment visar överträdelser av 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
Följande kodfragment åtgärdar överträdelserna:
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
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om prestanda inte är ett problem eller om loggningsargumenten inte omfattar dyra åtgärder.
Undertryck en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.