コードインスペクション:ログ記録メッセージテンプレートはログ記録メソッドの呼び出しごとに変化してはいけません
このインスペクションは、ロギングメソッド(特に JetBrains.Annotations の StructuredMessageTemplate 属性でアノテーションされたメソッド)の複数の呼び出し間で、ロギングメッセージのテンプレートが異なるケースを指摘しています。 これは、構造化ロギングシステムにおいて、ロギングの効率が悪くなり、ログ処理に誤りが生じる可能性があります。
インスペクションは Visual Studio の CA2254 に似ていますが、Microsoft ガイドラインで提案されているように、補間ベースのログメッセージ (例: logger.Log($"logging with {arguments} interpolation")) を構造的にログに記録された形式 (例: logger.Log("logging with {arguments} interpolation", arguments)) に書き換えるクイックフィックスを提供します。
目的は、構造化ログを使用するログフレームワークが、提供された文字列を一貫性がありフォーマットされたメッセージテンプレートとして認識できるようにすることです。 動的な値や変数は、メッセージテンプレート自体に挿入されるのではなく、常に個別の引数としてログに記録する必要があります。
using JetBrains.Annotations;
class Service
{
void Log(ILogger logger, int eventType, string fileName)
{
logger.WriteLog($"Published {eventType} event for {fileName}");
}
}
interface ILogger
{
void WriteLog([StructuredMessageTemplate]string message);
void WriteLog([StructuredMessageTemplate]string message,
params object[] args);
}
class Service
{
void Log(ILogger logger, int eventType, string fileName)
{
logger.WriteLog("Published {EventType} event for {FileName}",
eventType, fileName);
}
}
interface ILogger
{
void WriteLog([StructuredMessageTemplate]string message);
void WriteLog([StructuredMessageTemplate]string message,
params object[] args);
}
これらのプラクティスに従うことは、Microsoft の構造化ログに関する推奨事項に準拠しています。 高パフォーマンスの構造化ログのプラクティスの詳細については、 .NET での高パフォーマンスなログ記録を参照してください。
2026 年 6 月 12 日