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

时间:2015-12-02 23:23:52

标签: java logging log4j slf4j logback

所以我查看了有关登录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

1 个答案:

答案 0 :(得分:0)

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

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