有一段时间,建议使用 slf4j 来隐藏日志记录系统的实现。在那个时候,有些人觉得有必要改变他们的测井系统,但这是我多年没见过的。
鉴于目前大多数Java开发人员只使用 Logback 或 log4j 并且这些库已经足够成熟,不会更有意义摆脱包装并使用图书馆直接?
答案 0 :(得分:2)
这取决于你在做什么。
通常总是建议抽象,尽管在某些情况下,更多的抽象会使代码更难以维护和遵循,因此,运送一个绑定到特定记录器实现的应用程序可能会导致更简单的事情,尽管灵活性会低得多如果情况有所改变。
话虽如此,想象一下您正在开发第三方框架。使用它自己的记录器运送您自己的框架可能会导致问题,因为可能曾经使用过您的产品的人已经拥有自己的记录器,并且使用也有自己的记录器的框架可能会导致混淆/设置问题。 / p>
使用SLF4J之类的东西可以让你的框架提供日志,但是使用你正在使用你产品的记录器。
答案 1 :(得分:2)
首先,Logback正在实现SLF4J的接口。因此,如果使用Logback,则需要使用SLF4J。
SLF4J不仅仅是隐藏实现。使用SLF4J的最重要原因之一是它能够桥接不同的日志记录实现。请记住,您可以选择代码使用的日志库,但不能选择其他库使用的日志库。
例如,如果您直接使用Log4j 1.x,并且您正在使用正在使用JUL的另一个库(我们称之为A)。会发生什么,即使您已正确配置log4.xml,来自A的日志消息也不会转到您配置的日志文件,因为它是由JUL处理的。
SLF4J提供桥接,以便在类路径中放置正确的桥后,它会将其他日志库的调用重定向到SLF4J。使用上面的示例,假设现在使用SLF4J并使用Log4J作为其实现,然后将JUL-to-SLF4J桥接jar添加到类路径中。库A中的代码仍将使用JUL进行日志记录,但此类日志将重定向到SLF4J,因此SLF4J将捕获这些日志并使用您所需的日志库(例如Log4J)来捕获所有日志消息。如果您直接使用所需的日志记录库,则无法执行此操作。
通过上面的例子,如果您是A的开发人员,您也会知道坚持使用特定的日志库实现并不是一个好主意,因为它会给您的库的用户带来很多麻烦。通过使用SLF4J,它还可以解决问题,因此您的库的用户可以选择他们想要的任何日志记录后端,并且您在A中的代码将无缝地工作。