在 class 中初始化记录器的最佳方法是什么?

What's the best way to initialise a logger in a class?

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

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

的实例
logger = LoggerFactory.getLogger(SignUpController.class);

第二个传递 String 标识符(包和 class 名称):

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

问题是:

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

使用第一个

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

因为那个api(正在接受class对象),该方法在内部调用完全限定的class名称,所以日志记录 control/configuration 可以正常完成。

我更喜欢private static final因为

private:记录器实例不应该在 class

之外可用

static: class

的每个对象都有单独的实例是没有用的

final 初始化后不更改引用。

我用

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

对于一个人来说,这将始终确保正确的 class 名称,即使在重构 class 名称之后也是如此。每个实例化对象一个记录器实例的开销与每个 class 相比可以忽略不计。

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

这个解决方案:

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

的缺点是它会被复制并粘贴到其他 class 中,而且很容易忘记调整 class 名称。因此,我更喜欢这种对 "copy & paste":

安全的解决方案
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());