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