首页 文章

强制slf4j使用logback

提问于
浏览
27

反正是否强制slf4j使用特定的日志记录提供程序(在我的情况下是logback)?在他们的文档中:

在类路径上找到了多个绑定SLF4J API被设计为一次只与一个基础日志框架绑定 . 如果类路径上存在多个绑定,SLF4J将发出警告,列出这些绑定的位置 . 如果类路径上有多个绑定,请选择一个且只能使用一个绑定,并删除其他绑定 . 例如,如果类路径上同时包含slf4j-> simple-1.6.6.jar和slf4j-nop-1.6.6.jar,并且希望使用nop(> no-operation)绑定,则删除slf4j-类路径中的simple-1.6.6.jar . 如果无法删除超级绑定,SLF4J仍将与一个日志框架/实现绑定 . 从版本1.6.6开始,SLF4J将命名它实际绑定的框架/实现类 . 注意SLF4J发出的警告只是一个警告 .

在我的情况下,我有 log4j.jarslf4j-log4j12.jarlog4j-over-slf4j.jar 和类路径中的所有logback jar . 我知道将 slf4j-log4j12.jarlog4j-over-slf4j.jar 放在一起是错误的,但我的项目非常大,找到并排除maven依赖并不总是很简单 . 在这种情况下,slf4j甚至没有打印任何警告,因为我们只使用logback配置 . 我花了一天时间才明白这个 jar .

我想要的是强制slf4j通过JVM参数使用logback,例如,它可以打印警告,我可以在将来排除jar .

2 回答

  • 16

    除了清理类路径之外,没有办法强制SLF4J与给定的实现绑定 .

  • 21

    通常,您自己的代码位于类路径的开头 . 因此,一种方法是创建自己的org.slf4j.impl.StaticLoggerBinder类:

    package org.slf4j.impl;
    
    import org.slf4j.ILoggerFactory;
    import org.slf4j.spi.LoggerFactoryBinder;
    
    /**
     * Force tests to use JDK14 for logging.
     */
    @SuppressWarnings("UnusedDeclaration")
    public class StaticLoggerBinder implements LoggerFactoryBinder {
        private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
    
        public static String REQUESTED_API_VERSION = "1.6";
    
        public static final StaticLoggerBinder getSingleton() {
          return SINGLETON;
        }
    
        private StaticLoggerBinder() {
        }
    
        @Override
        public ILoggerFactory getLoggerFactory() {
            return new JDK14LoggerFactory();
        }
    
        @Override
        public String getLoggerFactoryClassStr() {
            return "org.slf4j.impl.JDK14LoggerFactory";
        }
    }
    

相关问题