次の方法で共有


CA1848: LoggerMessage デリゲートを使用する

プロパティ
ルール ID CA1848
Title LoggerMessage デリゲートを使用する
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 10 で既定で有効 いいえ

原因

LogInformation などのLogDebugの使用。

規則の説明

高パフォーマンスのログ記録シナリオでは、拡張メソッドではなく LoggerMessage パターン Logger<T> 使用します。

違反の修正方法

この規則違反の修正には、LoggerMessageAttribute を使用します。 (または、.NET 5 以前を使用している場合は、 LoggerMessage クラスを使用します)。

public class SomethingDoer
{
   private readonly ILogger _logger;
   public SomethingDoer(ILogger<SomethingDoer> logger)
   {
       _logger = logger;
   }

   public void DoSomething()
   {
       // This call violates CA1848.
       _logger.LogInformation("Did something!");
   }
}

次のコードは、違反を修正します。

public partial class SomethingDoer
{
   private readonly ILogger _logger;
   public SomethingDoer(ILogger<SomethingDoer> logger)
   {
       _logger = logger;
   }

   public void DoSomething()
   {
       Log_DidSomething();
   }

   [LoggerMessage(Level = LogLevel.Information, Message = "Did something!")]
   private partial void Log_DidSomething();
}

LoggerMessage には、 Logger<T> 拡張メソッドよりも次のパフォーマンス上の利点があります。

  • ロガー拡張メソッドでは、int などの値の型を object に "ボックス化" (変換) する必要があります。 LoggerMessage パターンでは、静的な Action フィールドと、厳密に型指定されたパラメーターを持つ拡張メソッドを使用してボックス化を回避します。
  • ロガー拡張メソッドでは、ログ メッセージが書き込まれるたびにメッセージ テンプレート (名前付きの書式文字列) を解析する必要があります。 LoggerMessage では、メッセージを定義するときに、一度テンプレートを解析する必要があるだけです。

どのようなときに警告を抑制するか

この規則による警告は抑制しないでください。

こちらもご覧ください