log.info使用log.isInfoEnabled

时间:2012-01-09 12:00:19

标签: java logging slf4j

我们正在使用SLF4J

根据团队最近的讨论

if(LOG.isDebugEnabled()){
  LOG.debug("hello " + a + " world" + b);
}

优于

LOG.debug("hello {} world {}", a, b);

因为在后一种情况下,即使未启用“debug”,也会创建字符串hello {} world {}。换句话说,即使不需要,我们也总是创建字符串。

我喜欢后一版本,因为它显着提高了可读性。

有人可以提供意见吗?

此致

Shardul。

修改

让我说的不同。

哪种方法更好?或者哪种方法最受欢迎?

Shardul。

2 个答案:

答案 0 :(得分:15)

不,较短的版本不会创建hello {} world {}”字符串。在编译和类加载期间,该字符串已创建并放置在常量池中。您始终从常量池引用相同的实例,它与引用常量int一样便宜。

但是由于您使用字符串连接,因此在第一种形式中创建了字符串

唯一的额外开销是使用三个参数调用LOG.debug,这些参数在内部调用isDebugEnabled()时不执行任何操作。也有机会内联。​​

话虽如此,我会在99%的情况下选择较短的形式。我明确调用isDebugEnabled的唯一情况是,计算要记录的消息的成本很高:

if(LOG.isDebugEnabled()){
  LOG.debug("hello {} world {}", cheap, veryExpensive());
}

如果veryExpensive()是ekhem,非常昂贵,那么如果将它丢弃则避免调用它是明智的。 BTW veryExpensive()不应该有任何side effects,很难想象长效,无副作用的方法......

答案 1 :(得分:1)

创建String对性能的影响可以忽略不计。但是当SLF4J documentation指定“时......如果禁用日志语句,此表单不会产生参数构造的成本 “意味着甚至没有创建String。

经过一番考虑后,“人为开销”,即代码清晰度的重要性使我们决定支持第二个例子。 因此,调用(以及编写和阅读)isXEnabled mehod也会产生开销。