Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnictví | Hodnota |
|---|---|
| Identifikátor pravidla | CA1873 |
| Titul | Vyhněte se potenciálně nákladnému protokolování |
| Kategorie | výkon |
| Oprava je destruktivní nebo nedestruktivní | Non-breaking |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
Příčina
V mnoha situacích je protokolování zakázané nebo nastavené na úroveň protokolu, která vede k zbytečnému vyhodnocení argumentů protokolování.
Popis pravidla
Při zavolání metod protokolování se jejich argumenty vyhodnocují bez ohledu na to, jestli je povolená úroveň protokolování. To může vést k nákladovým operacím, a to i v případě, že se zpráva protokolu nezapíše. Pokud chcete dosáhnout lepšího výkonu, chraňte nákladné volání protokolování pomocí kontroly IsEnabled nebo použití LoggerMessage vzoru.
Jak opravit porušení
Pokud chcete opravit porušení tohoto pravidla, použijte jeden z následujících přístupů:
- Hlídejte protokolovací hovor pomocí kontroly IsEnabled.
-
LoggerMessagePoužijte vzor s LoggerMessageAttribute. - Zajistěte, aby se v argumentech protokolování neprováděly nákladné operace, pokud to není nutné.
Example
Následující fragment kódu ukazuje porušení 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
Následující fragment kódu opravuje porušení:
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
Kdy potlačit upozornění
Pokud výkon není problém nebo pokud argumenty protokolování nezahrnují nákladné operace, je bezpečné potlačit upozornění z tohoto pravidla.
Potlačte upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Chcete-li pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost na none v konfiguračním souboru .
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.