다음을 통해 공유


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

속성
규칙 ID CA2254
제목 템플릿은 정적 식이어야 합니다.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 제안 사항

원인

로거 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.Warning("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.Warning("Person " + firstName + " " + lastName + " encountered an issue");

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

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

위반 문제를 해결하는 방법

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

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

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

오류를 표시하지 않는 경우

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

참고 항목