CA2254:模板应为静态表达式
属性 | 值 |
---|---|
规则 ID | CA2254 |
标题 | 模板应为静态表达式 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .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 方法。
何时禁止显示错误
如果用例不需要结构化日志记录,则可以安全地禁止显示来自此规则的警告。 如果日志消息模板在资源文件中定义,则禁止显示此规则也是安全的。