| 재산 | 가치 |
|---|---|
| 규칙 아이디 | CA1873 |
| Title | 잠재적으로 비용이 많이 드는 로깅 방지 |
| 범주 | 성능 |
| 수정 사항이 문제를 해결하고 있는지 혹은 새로운 문제를 일으키지 않는지 여부 | Non-breaking |
| .NET 10에서 기본적으로 사용하도록 설정 | 제안 사항 |
원인
대부분의 경우 로깅을 사용하지 않도록 설정하거나 로그 수준으로 설정하여 로깅 인수에 대해 불필요한 평가를 수행합니다.
규칙 설명
로깅 메서드가 호출되면 로깅 수준을 사용할 수 있는지 여부에 관계없이 해당 인수가 평가됩니다. 이로 인해 로그 메시지가 기록되지 않는 경우에도 비용이 많이 드는 작업이 실행될 수 있습니다. 성능을 향상시키려면 패턴을 확인하거나 사용하여 비용이 많이 드는 로깅 호출을 IsEnabled 보호합니다 LoggerMessage .
위반을 해결하는 방법
이 규칙 위반 문제를 해결하려면 다음 방법 중 하나를 사용합니다.
- 로깅 호출을 확인하여 보호합니다 IsEnabled.
- 와
LoggerMessage함께 LoggerMessageAttribute패턴을 사용합니다. - 필요한 경우가 아니면 로깅 인수에서 비용이 많이 드는 작업이 수행되지 않도록 합니다.
Example
다음 코드 조각은 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
다음 코드 조각은 위반을 해결합니다.
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
경고를 표시하지 않는 경우
성능이 중요하지 않거나 로깅 인수에 비용이 많이 드는 작업이 포함되지 않는 경우 이 규칙에서 경고를 표시하지 않아도 됩니다.
경고 표시 안 함
단일 위반을 억제하려면, 소스 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 다음 다시 활성화하세요.
#pragma warning disable CA1873
// The code that's violating the rule is on this line.
#pragma warning restore CA1873
파일, 폴더 또는 프로젝트에 대한 규칙을 비활성화하려면 none에서 해당 심각도를 로 설정하세요.
[*.{cs,vb}]
dotnet_diagnostic.CA1873.severity = none
자세한 내용은 코드 분석 경고를 표시하지 않는 방법을 참조하세요.
참고하십시오
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET