Apache Commons Logging的运行时发现算法有什么问题

Ta *_*Sas 43 java logging spring apache-commons-logging

Dave Syer(SpringSource)在他的博客中写道:

不幸的是,关于commons-logging的最糟糕的事情,以及使它不受新工具欢迎的因素,也是运行时发现算法.

为什么?它的运行时发现算法有什么问题?性能?

Pas*_*ent 75

为什么?它的运行时发现算法有什么问题?性能?

不,这不是表现,它是类加载器的痛苦.JCL发现过程依赖于类加载器黑客在运行时查找日志框架,但是这种机制导致许多问题,包括意外行为,难以调试类加载问题导致复杂性增加.在采用commons-logging API之前,Ceki(Log4J,SLF4J和Logback的作者)再次很好地捕获了这一点(它还提到了使用JCL观察到的内存泄漏问题).

这就是为什么创建了使用静态绑定的SLF4J的原因.

Ceki是SLF4J的作者,你可能认为他的文章有偏见,但相信我,他们不是,他提供了很多参考(证据)来证明他的观点.

总结一下:

  • 是的,众所周知,JCL会被打破,更好地远离它.
  • 如果要使用日志记录外观(并非所有项目都需要),请使用SLF4J.
  • SLF4J为仍然使用像Spring这样的JCL的框架提供了一个JCL-to-SLF4J桥:(
  • 我发现Logback,Log4J的继任者,是一个优秀的日志记录实现.
  • Logback本机实现了SLF4J API.这意味着如果您使用的是Logback,那么您实际上正在使用SLF4J API.

也可以看看


kro*_*ock 12

Commons logging是一个轻量级日志记录,它位于重量级日志API的顶部,即log4j,java.util.logging或其他受支持的日志记录API.

发现算法就是通用日志用来确定你用什么记录API在运行时这样就可以直接通过登录其API底层日志记录API调用.这样做的好处是,如果您想创建一个执行日志记录的库,您不希望将库的用户绑定到任何特定的重量级日志记录系统.您的代码的调用者可以通过log4j,java.util.logging等配置日志记录,并且commons日志记录将在运行时转发到该API.

公共采伐的常见抱怨:

  • 即使您不使用它,您依赖的库也可能因此无论如何都必须将它包含在类路径中.
  • 为您要登录的每个类加载器运行发现算法,这会产生不需要的结果,因此请确保将commons-logging.jar放在正确的类加载器中.
  • 比底层日志框架更复杂.
  • 底层日志框架的功能较少.

在没有任何可察觉的好处的情况下,复杂的类路径层次结构中存在更大的复杂性和不可预测性,这使得公共日志记录的用户变得激动.鉴于这种选择可能会被迫,你不会让用户同情. 有关使用commons-logging的强有力论据,请参阅此文章.