gpt4 book ai didi

java - Sonarlint投诉日志写入方法

转载 作者:行者123 更新时间:2023-12-02 08:36:36 25 4
gpt4 key购买 nike

log.info(String.format("Execution of method %s finished in %d ms", pointcut.getSignature().getName(), ms))

Sonarlint 显示以下错误:

"Preconditions" and logging arguments should not require evaluation

Compliant Solution:

logger.log(Level.SEVERE, "Something went wrong: {0} ", message);

让我们尝试一下:

log.info("Execution of method {0} finished in {1} ms", pointcut.getSignature().getName(), ms);

Printf-style format strings should be used correctly

Compliant Solution:

String.format("First %s and then %s", "foo", "bar");

我觉得 sonarlint 只是在 mock 我。

这是我根据他的判断,但我真的不明白发生了什么或者他为什么提示:

String logMessage = String.format("Execution of method %s finished in %d ms", pointcut.getSignature().getName(), ms);
log.info(logMessage);

有什么想法吗?

最佳答案

I don't really understand whats going or why he complaints in the first place:

第一个示例中的投诉原因是您无条件正在做大量工作来构建日志消息。如果日志级别高于INFO,那么工作就白费了。

<小时/>

第二个示例比第一个示例更好,因为只有当日志级别为 INFO 或更低时,才会从模板创建日志消息字符串。 pointcut.getSignature().getName()表达式仍会无条件地求值,但这可能是不可避免的,具体取决于您使用的特定日志记录 API。

(如果评估成本很高,那么您仍然会遇到性能问题。您可以考虑使用 if (log.isInfoLevel()) { ... } 防护,或使表达式评估变得懒惰的东西;例如 Supplier<String> 。但最好的解决方案可能是避免记录那个昂贵的表达式。)

<小时/>

第二个示例中的声纳投诉似乎与您在消息/格式字符串中使用的特定语法有关。 @C.Lechner 的回答是这样解释的:

  • In the first version with {} the type of {} is evaluated at runtime.
  • In the 2nd with %s, %d you define the type at compile time.

If possible you should use a type to avoid misuse of placeholder variables and allow java compiler to do some additional checks.

我并不完全相信 Java 编译器会进行检查。 (JLS 当然不需要。)但是编译器或(智能)静态代码分析器可以检查肯定是合理的。

无论哪种方式,都会在运行时(再次)检查格式字符串。

<小时/>

最后,这个版本:

String logMessage = String.format("Execution of method %s finished in %d ms",
pointcut.getSignature().getName(), ms);
log.info(logMessage);

与第一个版本有相同的性能问题,但我怀疑 Sonar 不够聪明,无法解决这个问题。

关于java - Sonarlint投诉日志写入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com