| プロパティ | 値 |
|---|---|
| ルール 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 では、メッセージを定義するときに、一度テンプレートを解析する必要があるだけです。
どのようなときに警告を抑制するか
この規則による警告は抑制しないでください。
こちらもご覧ください
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET