java – 拥有多个记录器实例而不是只有一个静态记录器类有什么好处?

所以我查看了有关登录Java(slf4j,log4j,logback等)的最佳实践,看起来,库之间已经同意日志API的外观.我一直读的建议是这样的代码,你在每个类中创建一个记录器:

class Foo{
  Logger logger = Logger.getLogger(Foo.class);
  //...
  logger.info("my log message");
  //...
}

现在我并没有真正获得为不同类别分配记录器的好处.为什么是info / debug / etc. Logger类中的方法不是静态的吗?

请不要给出像“你可以根据类别配置你的记录器的好处.例如,你可以将各个类的日志级别设置为DEBUG …”,因为我认为这是你可以做的事情.完成一个完全静态的Logger类.

如果你环顾四周(例如在stackoverflow:Log4J: Strategies for creating Logger instances这里),你会发现人们使用这样的习语:

Logger.getLogger(Thread.currentThread().getStackTrace()[2].getClass().getCanonicalName());

现在,您可以在静态(例如)info()方法中调用上面的代码,而不是为每个类创建一个记录器,您可以在其中确定调用类并同样地应用所有记录器配置.

那么有人能告诉我为什么有人应该每个类使用一个记录器而不是使用一个静态记录器的真正原因?这纯粹是出于历史原因吗?我错过了什么吗?我知道可能会对性能产生影响,但在内存使用方面它实际上是正面的(当然在运行时方面也是负面的)……

UPDATE
我想你甚至可以在静态信息/调试/等中使用这段代码.方法,比上面的代码更美观,更高效:

Reflection.getCallerClass()

然而,对该方法的支持似乎有问题> = JDK7

最佳答案
在静态info()方法中调用该行会对性能产生不利影响,因为每次都需要创建整个堆栈跟踪,即very slow.

将logger实例分配给每个类的静态变量意味着您可以明确表示该类,或者您可以使用昂贵的方法在加载类时仅从堆栈跟踪中确定类名.然后,您可以反复使用相同的记录器,而无需再次解析调用类.

转载注明原文:java – 拥有多个记录器实例而不是只有一个静态记录器类有什么好处? - 代码日志