【问题标题】:Logger for Java libraryJava 库的记录器
【发布时间】:2012-04-02 04:35:10
【问题描述】:

我正在编写一个库来收集我将在不同应用程序中使用的各种功能。我希望它生成对库用户可见的日志语句,即,如果我正在构建应用程序并且正在使用库,我希望库生成对我可见的日志语句。我怎么做?由于日志文件将由应用程序的开发人员配置,我的库如何知道如何记录?

【问题讨论】:

  • 看一看 Spring 框架。具体来说,依赖注入功能是对您最有用的部分。

标签: java logging packaging


【解决方案1】:

对此的标准解决方案是:

所有这些都将允许您通过配置来配置日志文件位置。

【讨论】:

    【解决方案2】:

    日志文件的位置设置在包外部的日志框架配置中。 配置文件通常位于类路径中。它的外观取决于您使用的日志记录框架 - 我建议使用 SLF4JLogback

    【讨论】:

      【解决方案3】:

      如果您正在开发一个,其他人将包含在他们的应用程序中,您应该使用日志外观。否则,您会强制库的用户配置并包含您选择的日志框架除了他们为应用程序选择的框架

      例如,如果您使用 log4j,但使用您的库的开发人员使用 logback,他将必须包含 log4j 配置文件和 log4j jar(或使用 other measures ) 让您的图书馆开心。

      Logging Facades 解决了这个问题(来自 Apache Commons Logging):

      在编写库时,记录信息非常有用。然而,那里有许多日志记录实现,一个库不能将某个特定的实现强加于该库所属的整个应用程序。

      Logging 包是不同日志实现之间的超薄桥梁。使用 commons-logging API 的库可以在运行时与任何日志记录实现一起使用。 Commons-logging 支持许多流行的日志实现,为其他人编写适配器是一项相当简单的任务。

      或者来自 SLF4J 的推理:

      Java 或 (SLF4J) 的简单日志外观作为各种日志框架的简单外观或抽象,例如java.util.logging、log4j 和 logback,允许最终用户在部署时插入所需的日志框架。

      记录立面的候选人是:

      我个人会推荐SLF4J(和Logback)。

      【讨论】:

      • 您的示例具有误导性。开发人员可以同时将 SLF4J API 用于 is 代码和 log4j 适配器用于 3rd 方。然后他只是选择了一些 SLF4J 后端,比如 logback。其实这是SLF4J的一个原因,就是这么简单。不需要 log4j 配置。
      • @RostislavMatl 你说的是 SLF4J“桥接模块”(slf4j.org/legacy.html)吗?这些允许您使用在内部使用 log4j,... 的库并将其日志消息重定向到 SLF4J(可能由 logback 支持)。如果您是图书馆的用户,这无疑是一个很棒的功能。但是,当您是库的开发人员时,为什么要强迫您的用户跳过这些障碍呢?为什么不直接使用门面?正如 SLF4J 页面所述,这些解决方案“适用于您无法控制的软件”。如果我误解了你,请纠正我。
      • 显然我们谈论不同的事情。您写道:“如果您使用 log4j,但使用您的库的开发人员使用 logback,他将不得不包含 log4j 配置”——这不是事实。同时这是一个糟糕的解决方案。我没有告诉你在开发新代码时不能使用 SLF4J。我选择了图书馆用户观点或观点,因为您更多时候是用户而不是创建者。
      • @RostislavMatl 啊,现在我明白了。我写了“他必须包括”,你说还有其他解决方案,即桥接模块。关于观点,我认为OP是从图书馆创建者的角度写的,因此我的答案也是这样写的。
      • @RostislavMatl 我已经更新了我的答案并添加了一个指向桥接模块的链接。但是,我不想过分强调这一点,因为我认为开发 新库 时最好的方法仍然是直接使用外观。你同意吗?
      猜你喜欢
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2011-05-20
      相关资源
      最近更新 更多