Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| Ingatlan | Érték |
|---|---|
| Szabályazonosító | CA1873 |
| Title | A potenciálisan költséges naplózás elkerülése |
| Kategória | teljesítmény |
| A javítás törést okoz vagy nem okoz törést | Nem törhető |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Javaslatként |
Oka
Sok esetben a naplózás le van tiltva, vagy olyan naplószintre van beállítva, amely szükségtelen értékelést eredményez a naplózási argumentumok esetében.
Szabály leírása
A naplózási metódusok meghívásakor a rendszer az argumentumokat attól függetlenül kiértékeli, hogy engedélyezve van-e a naplózási szint. Ez költséges műveleteket eredményezhet még akkor is, ha a naplóüzenet nem lesz megírva. A jobb teljesítmény érdekében őrizd meg a drága naplózási hívásokat a minta ellenőrzésével IsEnabled vagy használatával LoggerMessage .
Szabálysértések kijavítása
A szabály megsértésének kijavításához használja az alábbi módszerek egyikét:
- Őrizd meg a naplózási hívást egy ellenőrzéssel a következőre IsEnabled: .
- Használja a
LoggerMessagemintát a következővel LoggerMessageAttribute: . - Győződjön meg arról, hogy a költséges műveletek csak akkor hajthatók végre naplózási argumentumokban, ha szükséges.
Example
A következő kódrészlet a CA1873 megsértését mutatja be:
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
A következő kódrészlet kijavítja a szabálysértéseket:
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
Mikor kell letiltani a figyelmeztetéseket?
A szabály figyelmeztetését nyugodtan letilthatja, ha a teljesítmény nem jelent problémát, vagy ha a naplózási argumentumok nem járnak költséges műveletekkel.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.