【发布时间】: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 永远不会为空,并且会在传递给日志记录之前进行计算。
【问题讨论】: