Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Mülkiyet | Değer |
|---|---|
| Kural Kimliği |
CA1873 |
| Başlık | Pahalı olabilecek günlük kaydından kaçının |
| Kategori | Performans |
| Düzeltme kırılgan mı yoksa sağlam mı | Non-breaking |
| .NET 10'da varsayılan olarak etkin | Öneri olarak |
Nedeni
Birçok durumda, günlük devre dışı bırakılır veya günlük bağımsız değişkenleri için gereksiz bir değerlendirmeye neden olan bir günlük düzeyine ayarlanır.
Kural açıklaması
Günlüğe kaydetme yöntemleri çağrıldığında, günlük düzeyinin etkinleştirilip etkinleştirilmediğine bakılmaksızın bağımsız değişkenleri değerlendirilir. Bu, günlük iletisi yazılmasa bile pahalı işlemlerin yürütülmesine neden olabilir. Daha iyi performans için, özniteliğiyle kaynak tarafından oluşturulan günlüğü denetle IsEnabled veya kullan ile pahalı günlük çağrılarını LoggerMessageAttribute koru.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için aşağıdaki yaklaşımlardan birini kullanın:
- günlük aramasını için bir denetimle korur IsEnabled.
- Özniteliğiyle LoggerMessageAttribute kaynak tarafından oluşturulan günlüğü kullanın.
- Gerekli olmadıkça günlük bağımsız değişkenlerinde pahalı işlemlerin gerçekleştirilmediğine emin olun.
Example
Aşağıdaki kod parçacığı CA1873 ihlallerini gösterir:
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
Aşağıdaki kod parçacığı, kaynak tarafından oluşturulan günlüğü kullanarak ihlalleri düzeltir:
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
Uyarıların ne zaman bastırılması gerekiyor?
Performans önemli değilse veya günlük bağımsız değişkenleri pahalı işlemler içermiyorsa, bu kuraldan gelen bir uyarıyı engellemek güvenlidir.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, none önem derecesini olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
Daha fazla bilgi için bkz. Kod analizi uyarılarını gizleme.