Slf4j 自定义提供程序实现未被拾取

Slf4j custom provider implementation not being picked up

Slf4j 为 "fool" 后端特定代码库提供库,使其认为特定后端存在,同时将所有日志记录重定向到一个 slf4j api 兼容后端。

简而言之,log4j-over-sl4j 会将任何从 log4j 特定日志记录重定向到 slf4j。

所以我的类路径现在有

slf4j-api *-over-slf4j slf4j-simple (to be removed)

我正在尝试为 slf4j 1.8+ 提供自定义日志记录后端(请不要问为什么)。为了开始使用它,我已经将 slf4j-simple 复制到我的项目中。

当 slf4j-simple 作为依赖项日志记录按预期添加时,但是当我删除依赖项并简单地在我自己的代码库中保留完全相同的内容时,它不会拾取它(虽然不同的包)...

如何让 sl4j 看到我的自定义提供程序?

更新

我可以看到 jar 有一些额外的信息,可能是 slf4j 使用什么来选择提供者...

但是在我的例子中,我的日志记录后端在我自己的代码库中(我不想将它分离到一个库中),所以 是否有一个 api 可以将您的提供程序设置为 SLF4J?

参考 SLF4J FAQ,“How do I make my logging framework SLF4J compatible?”及周边地区:

  1. start with a copy of an existing module,
  2. create an adapter between your logging system and org.slf4j.Logger interface
  3. create a factory for the adapter created in the previous step,
  4. modify StaticLoggerBinder class to use the factory you created in the previous step

您的问题似乎没有提到 StaticLoggerBinder,这是 class SLF4J 正常工作所需要的 class。这就是 SLF4J 找到您的日志记录接口的特定实现的方式。

SLF4J 1.8+(截至 2018 年 6 月 12 日处于测试阶段)放弃了 StaticLoggerBinder 的概念,而是使用更好的东西 ServiceLoader

一旦您在自己的代码库中使用自己的包复制了 slf4j-simple 源代码,您只需在 ${projectRoot}/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider 处创建一个文件并将完整的 class 名称添加到您的拥有 class 应被拾取 your.package.YourLoggingServiceProvider

确保您删除任何与另一个提供商的实际绑定,slf4j 将给出一条明确的错误消息,表明您的 class 路径上有多个绑定。

现在尝试 LoggerFactory.getLogger("something").info("something") 它会选择您的 classes 进行日志记录...