力SLF4J使用的logback(Force slf4j to use logback)

2019-07-30 09:01发布

反正是有强制SLF4J使用特定的日志记录提供者(在的logback我的情况)? 在他们的文档:

多个绑定了的类路径中找到

SLF4J API飞漫与一个和在一个时间只有一个底层日志框架结合。 如果不止一个结合存在的类路径上,SLF4J会发出警告,列出这些绑定的位置。 当多个绑定可在类路径上,选择一个且只有一个绑定你希望使用,并删除其他绑定。 举例来说,如果你有两个slf4j->简单1.6.6.jar和类路径上SLF4J-NOP-1.6.6.jar和你想使用绑定NOP(>无操作),然后取出slf4j-简单1.6.6.jar在类路径。 如果这是不可能去除superflous绑定,SLF4J仍将有一个日志框架/实现绑定。 随着1.6.6版本,SLF4J将它命名实际上是绑定到架构/实现类。

注意到SLF4J发出的警告仅仅是一个警告。

就我而言,我有log4j.jarslf4j-log4j12.jarlog4j-over-slf4j.jar在classpath中所有的logback罐子。 我知道这是错误有slf4j-log4j12.jarlog4j-over-slf4j.jar在一起,但我的项目是非常大的,而且它并不总是简单的查找和排除Maven的依赖。 在这种情况下,即使SLF4J没有任何印刷警告,因为我们只使用的logback CONFIGS。 它花了我一天的时间来了解这个瓶子地狱。

我要的是通过JVM参数来强制使用SLF4J的logback,例如,这样就可以打印警告,我可以在将来排除罐。

Answer 1:

除了清理你的类路径,没有办法强迫SLF4J与给定的实现结合。



Answer 2:

通常您自己的代码是在类路径的开始。 正因为如此,要做到这一点的方法之一是创建自己的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";
    }
}


文章来源: Force slf4j to use logback