CA2254: テンプレートは静的な式にする必要があります

プロパティ
ルール ID CA2254
Title テンプレートは静的な式にする必要があります
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

ロガー 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);

どのようなときにエラーを抑制するか

ユース ケースで構造化ログが必要ない場合は、この規則からの警告を抑制しても安全です。 また、ログ メッセージ テンプレートがリソース ファイルで定義されている場合は、この規則を抑制しても安全です。

関連項目