【问题标题】:Force slf4j to use logback强制 slf4j 使用 logback
【发布时间】:2012-07-11 13:39:15
【问题描述】:

是否有强制 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 配置。我花了一天的时间才理解这个罐子地狱。

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

【问题讨论】:

    标签: logging log4j slf4j logback


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的回答,但我已经清理了我的类路径。
    • 即便如此,这是一个很好的答案
    • 如何使用此代码进行 logback,ILoggerFactory getLoggerFactory() 应该返回什么而不是 new JDK14LoggerFactory()
    • 如果你从 StaticLoggerFactory 类中复制并粘贴代码到你的 logback-classic.jar 中应该可以工作。
    【解决方案2】:

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

    【讨论】:

    • Logback 团队急需解决这个问题。
    • 绑定机制的唯一性是slf4j-api自诞生以来的核心特性。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2014-03-30
      • 2013-04-06
      相关资源
      最近更新 更多