【问题标题】:"Preconditions" and logging arguments should not require evaluation“前提条件”和日志记录参数不应该需要评估
【发布时间】:2021-10-25 12:10:03
【问题描述】:

我有这段代码:

String cause = ExceptionUtils.getStackTrace(result.getThrowable());
result.setAttribute(EXCEPTION, cause);
LOGGER.error(MessageFormat.format("Test has failed: {0}", cause));
collect(result);

我正在使用 SLF4J 进行日志记录

但是 SonarLint 不断警告我:

“前提条件”和日志记录参数不应要求评估

在我的日志中。根据问题描述:

将需要进一步评估的消息参数传递给 Guava com.google.common.base.Preconditions 检查可能会导致性能 惩罚。那是因为无论他们是否需要,每个论点 必须在实际调用方法之前解决。相似地, 将连接的字符串传递给日志记录方法也可能导致 不必要的性能损失,因为将执行连接 每次调用该方法时,无论日志级别是否低 足以显示消息。相反,您应该将代码结构化为 将静态或预先计算的值传递给 Preconditions 条件检查 并记录通话。具体来说,内置的字符串格式应该 用于代替字符串连接,并且如果消息是 方法调用的结果,则应跳过前提条件 完全,并且应该有条件地抛出相关的异常 而是。

我使用的是内置消息格式,但是正如您所见,我的论点是动态的,因为它是根据结果计算得出的。如何满足这个问题的声纳?抛出错误时会调用此代码,因此cause 永远不会为空,并且会在传递给日志记录之前进行计算。

【问题讨论】:

标签: java sonarlint


【解决方案1】:

目前尚不清楚(至少对我而言),您正在使用什么日志记录框架,但我认为您可以通过检查记录器是否启用了 ERROR 级别来解决这个 Sonar 问题。类似的东西

if (LOGGER.isEnabled(Level.ERROR) { 
    LOGGER.error(MessageFormat.format("Test has failed: {0}", cause));
}

你需要检查你的日志框架语法。

如果你使用的是 slf4j,你可以试试这个语法

LOGGER.error("Test has failed: {}", cause)

【讨论】:

  • 我用的是 slf4j,忘了说这个
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2021-07-11
  • 2015-04-17
  • 2020-08-24
  • 2019-01-31
相关资源
最近更新 更多