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říslušné jazyky | C# a Visual Basic |
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žijte protokolování generované zdrojem s atributem LoggerMessageAttribute .
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.
- Použijte protokolování generované zdrojem s atributem 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:
class ViolationExample
{
private readonly ILogger _logger;
public ViolationExample(ILogger<ViolationExample> 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 });
}
}
Class ViolationExample
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of ViolationExample))
_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í pomocí protokolování generovaného zdrojem:
partial class FixExample
{
private readonly ILogger _logger;
public FixExample(ILogger<FixExample> logger)
{
_logger = logger;
}
public void ProcessData(int[] data)
{
// Fixed: use source-generated logging.
// The data array is passed directly; no expensive operation executed unless log level is enabled.
LogProcessingData(data);
// Fixed: use source-generated logging.
LogTraceData(data.Length, data);
}
[LoggerMessage(Level = LogLevel.Debug, Message = "Processing {Data} items")]
private partial void LogProcessingData(int[] data);
[LoggerMessage(Level = LogLevel.Trace, Message = "Data: Count={Count}, Items={Items}")]
private partial void LogTraceData(int count, int[] items);
}
Partial Class FixExample
Private ReadOnly _logger As ILogger
Public Sub New(logger As ILogger(Of FixExample))
_logger = logger
End Sub
Public Sub ProcessData(data As Integer())
' Fixed: use source-generated logging.
' The data array is passed directly; no expensive operation executed unless log level is enabled.
LogProcessingData(data)
' Fixed: use source-generated logging.
LogTraceData(data.Length, data)
End Sub
<LoggerMessage(Level:=LogLevel.Debug, Message:="Processing {Data} items")>
Private Partial Sub LogProcessingData(data As Integer())
End Sub
<LoggerMessage(Level:=LogLevel.Trace, Message:="Data: Count={Count}, Items={Items}")>
Private Partial Sub LogTraceData(count As Integer, items As Integer())
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.