我有这个代码

[HttpGet("average/{videoGuid}")]
public async Task<IActionResult> AverageRatingOfVideo([FromRoute] string videoGuid)
{
    _logger.LogInformation($"Finding average rating of video : {videoGuid}");
    var avg = await _ratingService.GetVideoRatingAverageAsync(videoGuid);
    return Ok(avg);
}
我在这里得到警告$"Finding average rating of video : {videoGuid}"
我正在使用骑士,没有建议解决此警告。
我不明白为什么这会给我警告,我该如何解决?

最佳答案

消除警告的方法是单独提供变量videoGuid,如下所示:

_logger.LogInformation("Finding average rating of video : {VideoGuid}", videoGuid);
在这里,我首先删除了$符号,从而关闭了C#执行的字符串插值。现在,字符串中的{videoGuid}变成了“属性”,因此我将变量作为第二个参数传递给LogInformation。 Rider还提示字符串中的属性应以大写字母开头,因此我将其更改为{VideoGuid}
现在是一个真正的问题:为什么会有警告?
答案是字符串插值会阻止结构化日志记录。在消息后传递变量时,记录程序可以单独保存它们。如果仅将日志保存到文件中,则可能不会有什么区别,但是如果您以后决定登录到数据库或采用某种JSON格式,则只需更改日志接收器,就可以在日志中进行大量搜索更容易,而无需更改代码中的所有日志语句。
Stack Exchange上对此进行了很好的讨论。

关于c# - 消息模板应为编译时间常数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65874828/

10-10 23:01