仅在超类/抽象类中声明 slf4j 记录器并在所有子类中使用它是一种好习惯吗?

Cod*_*ete 1 java logging slf4j

仅在超类/抽象类中声明 slf4j 记录器使子类的内容更清晰(没有像private static final Logger logger = LoggerFactory.getLogger(Tuple5x36.class);混乱一样的混乱)。

这种做法是推荐的,还是存在重大缺陷?

sti*_*ger 7

使用日志中的这种方法,您的所有消息都将属于您的超类,因此您将无法通过祖先来区分它们,只能通过消息本身来区分它们。所以我建议为每个类都有一个单独的记录器实例。


Mik*_*own 5

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

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

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