仅在超类/抽象类中声明slf4j logger并在所有子类中使用它是一种很好的做法?

时间:2018-04-13 13:24:06

标签: java logging slf4j

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我看不到任何陷阱。在您的超类中这样声明它:

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

我相信,即使不是全部,大多数getLogger()实现也会从地图返回单例对象。因此,尽管避免实例构造时调用getLogger(),但即使几乎每个人都声明了记录器是静态的,也没有任何好处。但是由于调用速度很快,因此根本就没有收益。 (并且不将它们声明为静态具有使它们易于进行单元测试的好处。)

答案 2 :(得分:1)

缺点是对LoggerFactory.getLogger(Tuple5x36.class)的调用会创建一个记录器,该记录器被命名为用于创建它的类的完全限定名称。

换句话说,此调用会在com.package.to.Tuple5x36内创建一个记录器。它将出现在所有子类的日志条目中,因此您将遇到麻烦(或者可能没有办法)记录哪个实际类记录。

您也无法更改单个继承类的日志记录级别,但是对于所有这些类。

答案 3 :(得分:1)

我建议不要这样做,因为第一个建议日志消息来自抽象类,即使它没有,第二个确实是混乱。

添加" lombok"到你的依赖项,然后用@ Slf4j注释每个类来获得一个"私有Logger日志"变量可用。