【问题标题】:What's the best way to initialise a logger in a class?在类中初始化记录器的最佳方法是什么?
【发布时间】:2016-02-09 10:45:03
【问题描述】:

我有两个选项可以在类中初始化 Logger

第一种方法是提供Class<?>的实例:

logger = LoggerFactory.getLogger(SignUpController.class);

第二个是传递String 标识符(包和类名):

logger = LoggerFactory.getLogger("controller.SignUpController");

问题是:

为类初始化记录器的最佳方法是什么?
应该使用哪些修饰符? (访问修饰符,staticfinal

【问题讨论】:

  • 使用 String 参数而不是 Class 对象是硬编码。

标签: java logging log4j logback


【解决方案1】:

我用

public final Logger = LogFactory.getLogger(getClass());

一方面,即使在重构类名之后,这也将确保始终正确的类名。每个实例化对象与每个类相比,一个记录器实例的开销可以忽略不计。

我只在需要将某些内容作为静态上下文记录并使用您的第一种方法对其进行初始化时才使用静态记录器。

【讨论】:

    【解决方案2】:

    使用第一个

    private static final Logger logger = LoggerFactory.getLogger(SignUpController.class);
    

    因为那个api(接受类对象),方法内部调用了完全限定的类名,所以日志控制/配置可以正常进行。

    我更喜欢private static final,因为

    private:因为记录器实例不应该对类外可用

    静态:没有用为类的每个对象分别实例化

    final 表示在初始化后不更改引用。

    【讨论】:

      【解决方案3】:

      这个解决方案:

      private static final Logger logger = LoggerFactory.getLogger(SignUpController.class);
      

      有一个小缺点,就是会被复制粘贴到其他类中,很容易忘记调整类名。因此,我更喜欢这种对“复制和粘贴”安全的解决方案:

      private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
      

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 1970-01-01
        • 2019-07-24
        • 2017-11-01
        • 2012-01-28
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多