【问题标题】:What is the benefit of having multiple logger instances instead of having a single static logger class?拥有多个记录器实例而不是拥有单个静态记录器类有什么好处?
【发布时间】:2015-12-02 23:23:51
【问题描述】:

所以我查看了有关 Java 日志记录的最佳实践(slf4j、log4j、logback 等),并且似乎库之间已经同意日志 API 的外观。我一直阅读的建议是这样的代码,您可以在其中为每个类创建一个记录器:

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

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

请不要给出类似“好处是您可以根据类配置记录器。例如,您可以将各个类的日志级别设置为调试...”之类的回答,因为我认为这是您也可以使用完全静态的 Logger 类来完成。

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

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

现在,您无需为每个类创建一个记录器,您只需在静态(例如)info() 方法中调用上述代码,您可以在其中确定调用类并像您一样平等地应用所有记录器配置否则。

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

更新 我想你甚至可以在静态信息/调试/等中使用此代码。方法,比上面的代码更漂亮,性能更高:

Reflection.getCallerClass()

但是对该方法的支持似乎有问题>=JDK7

【问题讨论】:

    标签: java logging log4j slf4j logback


    【解决方案1】:

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

    将记录器实例分配给每个类的静态变量意味着您可以明确地了解该类,也可以使用昂贵的方法从堆栈跟踪中确定类名只需一次类已加载。然后,您可以一遍又一遍地使用同一个记录器,而无需再次解析调用类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 2020-08-13
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多