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);
使用例については、LoggerExtensions.LogInformation メソッドを参照してください。
どのようなときにエラーを抑制するか
ユース ケースで構造化ログが必要ない場合は、この規則からの警告を抑制しても安全です。 また、ログ メッセージ テンプレートがリソース ファイルで定義されている場合は、この規則を抑制しても安全です。
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET