仅在超类/抽象类中声明slf4j logger使子类的内容更加清晰(没有像private static final Logger logger = LoggerFactory.getLogger(Tuple5x36.class);
混乱的混乱)。
是推荐这种做法,还是存在重大缺陷?
答案 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日志"变量可用。