Megosztás a következőn keresztül:


CA1873: A potenciálisan költséges naplózás elkerülése

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 LoggerMessage mintá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.

Lásd még