Java库的日志记录器

36

我正在编写一个库,其中包含将在不同应用程序中使用的各种功能。我希望它能生成日志语句,对于使用该库的应用程序用户可见。例如,如果我正在构建一个应用程序并且正在使用该库,则希望该库生成对我可见的日志语句。要如何实现这一点呢?由于日志文件将由应用程序的开发人员配置,因此我的库如何知道如何记录日志?


来看看Spring框架吧。具体来说,依赖注入能力是对你最有用的部分。 - cdeszaq
4个回答

34

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

例如,如果您使用log4j,但使用您的库的开发人员使用logback,他将不得不包括log4j配置文件和log4j jar(或采取其他措施)才能使您的库正常工作。

日志门面解决了这个问题(来自Apache Commons Logging):

编写库时记录信息非常有用。但是,有很多日志实现,而库不能对其所属的整个应用程序强加使用特定的实现。

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

或者来自SLF4J的推理:

「简单的Java日志门面」或者说(SLF4J)是一个为各种日志框架提供简单门面或抽象化的工具,例如java.util.logging、log4j和logback,允许最终用户在部署时插入所需的日志框架。可供选择的日志门面包括:Apache Commons LoggingSLF4J。个人推荐使用SLF4J(搭配Logback)。

你的例子有误导性。开发者可以同时使用SLF4J API来编写自己的代码,以及log4j适配器来处理第三方库的日志。然后,他只需要选择一些SLF4J后端,比如logback。事实上,这也是SLF4J存在的原因之一,它非常简单。不需要任何log4j配置。 - Rostislav Matl
1
@RostislavMatl 您说的是关于 SLF4J "bridging modules"(http://www.slf4j.org/legacy.html)吗?这些模块允许您使用一个使用 log4j,... 的库,并将其日志消息重定向到 SLF4J(可能由 logback 支持)。如果您是库的用户,则此功能确实非常好。但是,当您是库的开发人员时,为什么要强制您的用户通过这样的步骤呢?为什么不直接使用门面?正如 SLF4J 页面所述,这些解决方案适用于“超出您控制范围的软件”。如果我误解了您,请纠正我。 - Joe23
显然,我们谈论的是不同的事情。你写道:“如果你使用log4j,但使用你的库的开发人员使用logback,他将不得不包括一个log4j配置”——这不是真的。同时这也是一个不好的解决方案。我没有告诉你在开发新代码时不能使用SLF4J。我选择了库用户视角,因为你更经常做用户而不是创建者。 - Rostislav Matl
2
@RostislavMatl 啊,现在我明白了。我写了“他将不得不包括”,而你说还有其他解决方案,即桥接模块。关于观点,我认为OP是从库的创建者的角度来写的,因此我的答案也是这样写的。 - Joe23
@RostislavMatl 我已经更新了我的回答,并添加了一个链接到桥接模块。然而,我不想过分强调这一点,因为我认为开发新库时最好的方法仍然是直接使用门面。你同意吗? - Joe23
是的,我强烈建议使用SLF4J作为后端的logback,并通过适配器/桥接模块统一环境中第三方组件的日志记录。 - Rostislav Matl

4

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

0

从Java 9开始,库的作者应该使用System#getLogger门面,并让开发者选择日志后端框架。

所有流行的Java日志框架都实现了新门面SPI服务提供者


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接