31

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

例如,我想要通过 JVM 参数强制 slf4j 使用 logback,这样它就可以打印警告,并且我可以在将来排除 jars。

4

3 回答 3

33

通常,您自己的代码位于类路径的开头。因此,一种方法是创建自己的 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";
    }
}
于 2012-09-20T22:21:06.953 回答
17

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

于 2012-07-11T14:06:45.423 回答
0

我相信如果您将 logback JAR 放在类路径的开头(或在其他包含 slf4j impl 的 JAR 之前),它将是使用的那个。

但是,如果 slf4j 支持 JVM arg 指定包含 impl 的 JAR 并覆盖在类路径中查找,那就太好了,这样您就不必处理在类路径中对 JAR 进行排序以确保使用您想要的 JAR .

于 2022-01-19T20:19:22.327 回答