CA2254: 템플릿은 정적 식이어야 합니다.

속성 값
규칙 ID CA2254
제목 템플릿은 정적 식이어야 합니다.
범주 사용 현황
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 제안 사항
적용 가능한 언어 C# 및 Visual Basic

원인

로거 API에 전달된 메시지 템플릿은 상수가 아닙니다. 이는 전달된 템플릿이 문자열 연결 또는 보간을 사용할 때 발생합니다. 대신, 템플릿은 메시지 템플릿 형식의 로그 메시지를 나타내는 상수 값이어야 합니다. 예: "User {User} logged in from {Address}" 자세한 내용은 로그 메시지 템플릿 서식을 참조 하세요.

규칙 설명

로깅을 수행할 때 자리 표시자 값과 함께 로그의 구조(자리 표시자 이름 포함)를 유지하는 것이 좋습니다. 이 정보를 유지하면 로그 집계 및 모니터링 소프트웨어에서 더 나은 관찰 및 검색이 가능합니다.

선호:

var firstName = "Lorenz";
var lastName = "Otto";

// This tells the logger that there are FirstName and LastName properties
// on the log message, and correlates them with the argument values.
logger.LogWarning("Person {FirstName} {LastName} encountered an issue", firstName, lastName);

선호하지 않음

// DO NOT DO THIS

var firstName = "Lorenz";
var lastName = "Otto";

// Here, the log template itself is changing, and the association between named placeholders and their values is lost.
logger.LogWarning("Person " + firstName + " " + lastName + " encountered an issue");

// String interpolation also loses the association between placeholder names and their values.
logger.LogWarning($"Person {firstName} {lastName} encountered an issue");

로깅 메시지 템플릿은 호출마다 달라서는 안 됩니다.

위반 문제를 해결하는 방법

메시지 템플릿을 상수 식으로 업데이트합니다. 템플릿에서 직접 값을 사용하는 경우 명명된 자리 표시자를 대신 사용하도록 템플릿을 리팩터링합니다.

logger.LogWarning("Person {FirstName} {LastName} encountered an issue", firstName, lastName);

사용 예제는 메서드를 참조하세요 LoggerExtensions.LogInformation .

오류를 억제해야 하는 경우

사용 사례에 구조적 로깅이 필요하지 않은 경우 이 규칙에서 경고를 표시하지 않아도 됩니다. 로그 메시지 템플릿이 리소스 파일에 정의된 경우에도 이 규칙을 표시하지 않는 것이 안전합니다.

참고하기