log.info使用log.isInfoEnabled

SB.*_*SB. 5 java logging slf4j

我们正在使用SLF4J

基于团队最近的讨论

if(LOG.isDebugEnabled()){
  LOG.debug("hello " + a + " world" + b);
}
Run Code Online (Sandbox Code Playgroud)

比...更好

LOG.debug("hello {} world {}", a, b);
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以提供意见吗?

问候,

Shardul.

编辑

让我换一点吧.

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

Shardul.

Tom*_*icz 15

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

但字符串在第一个形式,因为你使用字符串连接创建.

唯一的额外开销是调用LOG.debug三个参数,它们在isDebugEnabled()内部调用时什么也不做.它也有可能被内联.

话虽如此,我会在99%的情况下采用缩短形式.我明确调用的唯一情况isDebugEnabled是计算要记录的消息时会产生很大的成本:

if(LOG.isDebugEnabled()){
  LOG.debug("hello {} world {}", cheap, veryExpensive());
}
Run Code Online (Sandbox Code Playgroud)

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


kos*_*tja 6

创建的性能影响String可以忽略不计。但正如SLF4J 文档指定的“...如果日志语句被禁用,这种形式不会产生参数构造的成本”,这意味着甚至没有创建字符串。

经过一番考虑,“人力开销”,即代码清晰度的重要性,使我们决定支持第二个示例。更重要的是,调用(以及写入和读取)方法还涉及开销isXEnabled