首页 > 解决方案 > 如何在库中配置 sl4j API,同时使客户端可以使用自己的日志记录实现?

问题描述

我目前正在将 Logback 用于库,现在我想更改以使用 sl4j,以便我的库的用户不会被迫使用 Logback。

从我目前阅读的内容来看,在我的配置中我应该有SL4J-api logback-classic,所以基本上是这样的:

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>{sl4j-api.version}</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>{logback.version}</version>
</dependency>

这意味着在库中我将使用 sl4j API,而实际的记录器实现将是 log4j。

但这也意味着当我的客户使用该库时,log4j jar 也将作为依赖项包含在内。而且我不知道有什么方法可以防止这种情况发生。

我认为使用 sl4j 的目的是防止库的客户端必须处理他们不需要的记录器罐子的情况。但似乎情况并非如此。

这意味着如果他们想改用 log4j,他们仍然必须<exclusion>在他们的 pom 中编写排除logback-classic.

或者是否有任何其他方法可以使用 sl4j,以及库 jar 中的特定记录器,并且特定记录器 jar 不包含在客户端所依赖的打包 jar 中。这样客户不需要排除库附带的那些,而只需要插入他们自己的特定记录器?

如果可以做到这一点,配置会是什么样子?

标签: javaloggingslf4j

解决方案


You are correct that the purpose of using slf4j in a library is to allow the consumer of the library to choose the logging backend implementation. The way to achieve that is to remove the dependency on logback-classic from the library. The slf4j-api dependency provides all of the types required to write log statements, and libraries should not depend on a concrete logging implementation.

If you need to use a logging implementation when running tests, you can specify the dependency with test scope:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>{logback.version}</version>
    <scope>test</scope>
</dependency>

This will cause Maven to put the dependency on the classpath only when compiling and running tests. Downstream consumers of the library will not inherit a transitive dependency on logback-classic in this case.


推荐阅读