拥有多个记录器实例而不是拥有单个静态记录器类的好处是什么



所以我研究了关于在Java中日志记录的最佳实践(slf4j、log4j、logback等),并且似乎库之间同意API的日志记录应该是什么样子。我一直阅读的建议是这样的代码,在这里你可以为每个类创建一个记录器:

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

现在,我并没有真正得到为不同的类拥有单独的记录器的好处。为什么是info/debug等。Logger类中的方法不是静态的?

请不要给出类似"好处是你可以根据类来配置你的记录器。例如,你可以将单个类的日志级别设置为DEBUG…"的警告,因为我认为这也是你可以用一个完全静态的记录器类来完成的。

如果你环顾四周(例如,这里的stackoverflow:Log4J:创建Logger实例的策略),你会发现人们使用这样的习语:

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

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

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

更新我想你甚至可以在静态信息/debug等中使用这段代码。方法,它比上面的代码更漂亮、更具性能:

Reflection.getCallerClass()

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

在静态info()方法内部调用该行会对性能产生不利影响,因为每次都需要创建整个堆栈跟踪,而且速度非常慢。

将记录器实例分配给每个类的静态变量意味着,您可以显式地了解该类,也可以在加载该类时使用昂贵的方法从堆栈跟踪中确定类名一次。然后,您可以反复使用相同的记录器,而不必再次解析调用类。

最新更新