强制slf4j使用logback

时间:2012-07-11 13:39:16

标签: logging log4j slf4j logback

是否有强制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以及classpath中的所有logback jar。我知道将slf4j-log4j12.jarlog4j-over-slf4j.jar放在一起是错误的,但我的项目非常大,找到并排除maven依赖并不总是很简单。在这种情况下,slf4j甚至没有打印任何警告,因为我们只使用logback配置。我花了一天时间来理解这个罐头。

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

2 个答案:

答案 0 :(得分:22)

通常,您自己的代码位于类路径的开头。因此,一种方法是创建自己的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";
    }
}

答案 1 :(得分:16)

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