【问题标题】:The logging message template should not vary between calls (CA2254) when only passing on variables仅传递变量时,日志消息模板不应在调用 (CA2254) 之间变化
【发布时间】:2022-04-30 17:34:55
【问题描述】:

我理解这个警告的概念(类似于this question),但是这段代码有什么问题?

    private async Task LogWarningAsync(short? userCodeId, string message, params object[] args)
    {
        _logger.LogWarning(message, args);

        // Do something on the database...
    }

警告:

CA2254

日志消息模板不应因调用“LoggerExtensions.LogWarning(ILogger, string?, params object?[])”而异

【问题讨论】:

  • 我猜只是因为message 是一个变量。为什么要调用运行_logger.LogWarning 的方法?为什么不能将_logger.LogWarning 直接与编译时日志模板一起使用?另外,您的方法LogWarningAsync进行数据库调用?
  • @gunr2171 可能LogWarningAsync() 命名不当,但情况是在此类中,一些敏感的日志消息必须同时进入日志文件和系统日志数据库表(很少见)。在撰写本文时,在此警告之前,出于减少代码重复和不想意外忘记日志的明显原因,将两者结合在一起。
  • 假设我将其拆分为两个调用:_logger.LogWarning('My sample message'); await LogWarningAsync('My sample message'); 每次调用此方法时,我都将不得不复制输入消息和参数,我不太愿意这样做。跨度>

标签: c#


【解决方案1】:

这里是discussion 其他人遇到有关 CA2254 的类似问题。希望这将在未来的版本中得到解决。

目前,我最好的解决方案是忽略警告。

    private async Task LogWarningToDatabaseAsync(short? userCodeId, string message, params object[] args)
    {
#pragma warning disable CA2254 // Template should be a static expression
        _logger.LogWarning(message, args);
#pragma warning restore CA2254 // Template should be a static expression

        // Do something on the database...
    }

替代方案不是很令人兴奋。

    private async Task LogWarningToDatabaseAsync(short? userCodeId, string message, params object[] args)
    {
        // Move to parent.
        //_logger.LogWarning(message, args);

        // Do something on the database...
    }

    private async Task SampleAsync(short? userCodeId, string aaa, string bbb)
    {
        // I'm not happy about repeating the input message every time this gets called.
        _logger.LogWarning("My sample message with data {aaa} and more data {bbb}", aaa, bbb);
        await LogWarningToDatabaseAsync(userCodeId, "My sample message with data {aaa} and more data {bbb}", aaa, bbb);
    }

【讨论】:

  • 字符串插值导致警告。因此,传递 string.Format 等变量的工作方式如示例任务方法中的@peet-brits 所示,并删除了警告。
【解决方案2】:

这实际上是一个相关的警告。 在应用程序中生成日志时,不应包含变量来构建日志消息。例如,“用户 128973 登录”不是一个好的日志,因为您无法将所有这些“登录”日志组合在一起以生成统计信息。相反,您应该将用户 ID 放在日志对象中的单独对象中(附加数据)

【讨论】:

  • 我正在处理的情况是当变量是“用户 {UserId} 登录”时,这不是同一个问题。
【解决方案3】:

你真的不应该在这里压制这个分析规则,在你的情况下标记是正确的。您希望同时记录到数据库表和日志文件的用例场景不应通过包装常规日志记录系统来解决。应该通过将日志输出添加到记录到相关表的记录器来解决它。是的,它可以过滤而不是记录所有内容。了解如何使用您选择的日志库最好地做到这一点。

【讨论】:

  • 我听到了,但我通常不会登录数据库。这是具有特殊功能的特殊情况。另一个出现此警告的地方是在某个或其他资源文件中定义消息时。这也应该被认为是正确的用法。
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2012-09-20
  • 2017-08-26
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多