Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | Value |
|---|---|
| ID della regola | CA1873 |
| Titolo | Evitare la registrazione potenzialmente costosa |
| Categoria | Prestazioni |
| La correzione causa un'interruzione o meno | Non-breaking |
| Abilitato per impostazione predefinita in .NET 10 | Come suggerimento |
Motivo
In molte situazioni, la registrazione è disabilitata o impostata su un livello di log che comporta una valutazione non necessaria per gli argomenti di registrazione.
Descrizione regola
Quando vengono chiamati i metodi di registrazione, i relativi argomenti vengono valutati indipendentemente dal fatto che il livello di registrazione sia abilitato. Ciò può comportare l'esecuzione di operazioni costose anche quando il messaggio di log non verrà scritto. Per prestazioni migliori, proteggere le chiamate di registrazione costose con un controllo o IsEnabled usare il LoggerMessage modello.
Come correggere le violazioni
Per correggere una violazione di questa regola, usare uno degli approcci seguenti:
- Proteggere la chiamata di registrazione con un controllo a IsEnabled.
- Usare il
LoggerMessagemodello con LoggerMessageAttribute. - Assicurarsi che le operazioni costose non vengano eseguite negli argomenti di registrazione, a meno che non sia necessario.
Example
Il frammento di codice seguente mostra le violazioni di 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
Il frammento di codice seguente corregge le violazioni:
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
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola se le prestazioni non sono un problema o se gli argomenti di registrazione non comportano operazioni costose.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.