| 属性 | 值 |
|---|---|
| 规则 ID | CA1848 |
| 标题 | 使用 LoggerMessage 委托 |
| 类别 | “性能” |
| 修复是中断修复还是非中断修复 | 非中断 |
| 在 .NET 9 中默认启用 | 否 |
原因
使用记录器扩展方法,例如 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 只需分析一次模板即可。
何时禁止显示警告
不禁止显示此规则发出的警告。