Slf4j自定义提供程序实现没有被提取

时间:2018-06-11 06:14:22

标签: java logging slf4j slf4j-api

Slf4j提供库来“欺骗”后端特定的代码库,使特定的后端存在,同时将所有日志记录重定向到一个slf4j api兼容的后端。

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

所以我的classpath现在有

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

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

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

如何让sl4j查看我的自定义提供商?

enter image description here

更新

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

但是在我的情况下,我的日志记录后端在我自己的代码库中(我不想将它分成库),所以是否有api将您的提供程序设置为SLF4J?

enter image description here

2 个答案:

答案 0 :(得分:2)

请参阅SLF4J常见问题解答," How do I make my logging framework SLF4J compatible?"和周边地区:

  
      
  1. 从现有模块的副本开始,
  2.   
  3. 在日志系统和org.slf4j.Logger接口之间创建适配器
  4.   
  5. 为上一步中创建的适配器创建工厂
  6.   
  7. 修改StaticLoggerBinder类以使用您在上一步中创建的工厂
  8.   

看起来您的问题看起来不像StaticLoggerBinder,这是为了让SLF4J正常工作所需的类。这就是SLF4J如何找到日志记录界面的具体实现。

答案 1 :(得分:1)

SLF4J 1.8+(截至12.06.2018处于测试阶段)放弃了StaticLoggerBinder的概念,而是使用更好的名为ServiceLoader的东西。

在您自己的代码库中使用自己的软件包获得slf4j-simple源代码的副本后,您只需要在${projectRoot}/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider创建一个文件,并将完整的类名放到您自己的类中your.package.YourLoggingServiceProvider

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

现在尝试LoggerFactory.getLogger("something").info("something")它会拿起你的课程进行记录......