为什么我们声明Loggers静态最终?

问题

在Java中,为什么最佳做法是声明loggerstatic final

private static final Logger S_LOGGER

#1 热门回答(171 赞)

  • 私人 - 所以没有其他类可以劫持你的记录器
  • static - 所以每个类只有一个记录器实例,也避免了序列化记录器的尝试
  • final - 无需在课程的整个生命周期内更改记录器

另外,我更喜欢namelog尽可能简单,但更具描述性。

编辑:但是这些规则有一个有趣的例外:

protected final Logger log = LoggerFactory.getLogger(getClass());

而不是:

private static final Logger log = LoggerFactory.getLogger(Foo.class);

前一种方法允许你在整个继承层次结构中的所有类中使用相同的记录器名称(实际类的名称)。所以ifBarextendsFoo,两者都会记录到Barlogger。有些人觉得它更直观。


#2 热门回答(9 赞)

查看此博文:Get Rid of Java Static Loggers。这是你如何使用slf4j withjcabi-log

import com.jcabi.log.Logger;
class Foo {
  void save(File f) {
    Logger.info(this, "file %s saved successfully", f);
  }
}

永远不要再使用静电噪音了。


#3 热门回答(4 赞)

static表示你只为每个类创建一个Logger,而不是每个类的一个logger。一般来说,这就是你想要的 - 因为记录器往往只是根据类别而变化。

final表示你不会更改thelogger变量的值。这是事实,因为你几乎总是将所有日志消息(从一个类)抛出到同一个记录器。即使在类很可能想要将某些消息发送到不同的记录器的情况下,创建另一个记录器变量(例如,widgetDetailLogger)而不是通过动态地改变静态变量的值也会更加清楚。