仅在 superclass/abstract class 中声明 slf4j 记录器并在所有子 classes 中使用它是好的做法吗?

Declaring slf4j logger only in superclass/abstract class and using it in all child classes is good practice?

仅在 superclass/abstract class 中声明 slf4j 记录器使子 class 的内容更加清晰(没有像 private static final Logger logger = LoggerFactory.getLogger(Tuple5x36.class); 那样混乱的东西)。

是否推荐这种做法,或者存在重大缺陷?

在日志中使用这种方法,您的所有消息都将属于您的超级class,因此您将无法通过祖先来区分它们,只能通过消息本身。 所以我建议为每个 class.

有一个单独的记录器实例

陷阱是对 LoggerFactory.getLogger(Tuple5x36.class) 的调用会创建一个记录器,该记录器的命名空间是用于创建它的 class 的完全限定名称。

换句话说,此调用创建了一个放置在 com.package.to.Tuple5x36 中的记录器。该名称将出现在所有子 classes 的日志条目中,因此您将很难(或者可能无法)区分哪个实际 class 记录。

您也不能更改单个继承 class 的日志级别,但可以更改所有继承级别。

我建议两者都不做,因为第一个建议日志消息来自摘要 class,即使它不是,第二个确实是一团糟。

将 "lombok" 添加到您的依赖项中,然后用 @Slf4j 注释每个 class 以获得可用的 "private Logger log" 变量。

我没有看到任何陷阱。在您的超类中声明它:

protected Logger logger = LoggerFactory.getLogger(this.getClass());

我相信大多数(如果不是全部的话)getLogger() return 来自地图的单例对象的实现。因此,将记录器声明为静态没有任何好处——尽管几乎每个人都这样做——除了避免在实例构造时调用 getLogger() 之外。但由于该调用速度很快,因此基本上不存在好处。 (并且不将它们声明为静态的好处是使它们易于模拟单元测试。)