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

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

不幸的是,关于共享资源日志记录最糟糕的事情,以及使它在新工具中不受欢迎的原因,也是运行时发现算法。

为什么?其运行时发现算法存在什么问题?性能?


答案 1

为什么?其运行时发现算法存在什么问题?性能?

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

这就是创建使用静态绑定的SLF4J的原因。

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

总结一下:

  • 是的,JCL是众所周知的坏了,最好远离它。
  • 如果要使用日志记录外观(并非所有项目都需要它),请使用 SLF4J。
  • SLF4J为仍然使用JCL的框架提供了JCL到SLF4J的桥梁,如Spring :(
  • 我发现Logback,Log4J的继任者,是一个优秀的日志记录实现。
  • Logback 以本机方式实现 SLF4J API。这意味着,如果您使用的是 Logback,则实际上是在使用 SLF4J API。

另请参见


答案 2

Commons logging是一个轻量级的日志记录立面,它位于重型日志记录API之上,可以是log4j,java.util.logging或其他受支持的日志记录API。

发现算法是公共日志记录用于确定您在运行时使用的日志记录 API,以便它可以通过其 API 将日志调用定向到底层日志记录 API。这样做的好处是,如果要创建执行日志记录的库,则不希望将库的用户绑定到任何特定的重度日志记录系统。代码的调用者可以通过log4j,java.util.logging等配置日志记录,共享资源日志记录将在运行时转发到该API。

公共记录的常见抱怨:

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

在复杂的类路径层次结构中感知到的更大的复杂性和不可预测性,没有任何可感知的好处,这使得共享资源日志记录的用户感到不安。鉴于这种选择可能强加给您,也不会让用户产生同情心。请参阅本文,了解反对使用共享资源日志记录的令人信服的论据。


推荐