• SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"


    以下为自己刚学习java遇到及排错过程

    日志换成了 slf4j+logback,没看到本地有日志文件生成,调试时发现有错误提示(是在加载druid时出现的):

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    

     网上说没有配置实际的日志实现包导致,但在pom.xml中是有配置的:

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.26</version>
        </dependency>
    
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
          <version>1.2.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.2.3</version>
          <scope>test</scope>  // 注意此处
        </dependency>
    

      找到出错的源码:comalibabadruid1.1.16druid-1.1.16-sources.jar!comalibabadruidpoolDruidAbstractDataSource.java

    public abstract class DruidAbstractDataSource extends WrapperAdapter 
    implements DruidAbstractDataSourceMBean, DataSource, DataSourceProxy, Serializable 
    {
        private static final long serialVersionUID = 1L;
        private final static Log  LOG  = LogFactory.getLog(DruidAbstractDataSource.class); // 此处
    	...
    }
    

      comalibabadruid1.1.16druid-1.1.16-sources.jar!comalibabadruidsupportloggingLogFactory.java

    public class LogFactory {
    
        private static Constructor logConstructor;
    
        static {
            String logType= System.getProperty("druid.logType");
            if(logType != null){
                if(logType.equalsIgnoreCase("slf4j")){
                    tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl");
                }else if(logType.equalsIgnoreCase("log4j")){
                    tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.support.logging.Log4jImpl");
                }else if(logType.equalsIgnoreCase("log4j2")){
                    tryImplementation("org.apache.logging.log4j.Logger", "com.alibaba.druid.support.logging.Log4j2Impl");
                }else if(logType.equalsIgnoreCase("commonsLog")){
                    tryImplementation("org.apache.commons.logging.LogFactory",
                            "com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl");
                }else if(logType.equalsIgnoreCase("jdkLog")){
                    tryImplementation("java.util.logging.Logger", "com.alibaba.druid.support.logging.Jdk14LoggingImpl");
                }
            }
            // 优先选择log4j,而非Apache Common Logging. 因为后者无法设置真实Log调用者的信息
            tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl"); // 此处
            tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.support.logging.Log4jImpl");
            tryImplementation("org.apache.logging.log4j.Logger", "com.alibaba.druid.support.logging.Log4j2Impl");
            tryImplementation("org.apache.commons.logging.LogFactory",
                              "com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl");
            tryImplementation("java.util.logging.Logger", "com.alibaba.druid.support.logging.Jdk14LoggingImpl");
    
            if (logConstructor == null) {
                try {
                    logConstructor = NoLoggingImpl.class.getConstructor(String.class);
                } catch (Exception e) {
                    throw new IllegalStateException(e.getMessage(), e);
                }
            }
        }
    }
    
    private static void tryImplementation(String testClassName, String implClassName) {
    	if (logConstructor != null) {
    		return;
    	}
    
    	try {
    		Resources.classForName(testClassName);
    		Class implClass = Resources.classForName(implClassName);
    		logConstructor = implClass.getConstructor(new Class[] { String.class });
    
    		Class<?> declareClass = logConstructor.getDeclaringClass();
    		if (!Log.class.isAssignableFrom(declareClass)) {
    			logConstructor = null;
    		}
    
    		try {
    			if (null != logConstructor) {
    				logConstructor.newInstance(LogFactory.class.getName()); // 此处
    			}
    		} catch (Throwable t) {
    			logConstructor = null;
    		}
    
    	} catch (Throwable t) {
    		// skip
    	}
    }
    

    comalibabadruid1.1.16druid-1.1.16-sources.jar!comalibabadruidsupportloggingSLF4JImpl.java

    public class SLF4JImpl implements Log {
    
        private static final String callerFQCN = SLF4JImpl.class.getName();
        private static final Logger testLogger = LoggerFactory.getLogger(SLF4JImpl.class); // 此处
        static {
            // if the logger is not a LocationAwareLogger instance, it can not get correct stack StackTraceElement
            // so ignore this implementation.
            if (!(testLogger instanceof LocationAwareLogger)) {
                throw new UnsupportedOperationException(testLogger.getClass() + " is not a suitable logger");
            }
        }
    	...
    }

    orgslf4jslf4j-api1.7.26slf4j-api-1.7.26-sources.jar!orgslf4jLoggerFactory.java

        public static Logger getLogger(Class<?> clazz) {
            Logger logger = getLogger(clazz.getName()); // 此处
            if (DETECT_LOGGER_NAME_MISMATCH) {
                Class<?> autoComputedCallingClass = Util.getCallingClass();
                if (autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) {
                    Util.report(String.format("Detected logger name mismatch. Given name: "%s"; computed name: "%s".", logger.getName(),
                                    autoComputedCallingClass.getName()));
                    Util.report("See " + LOGGER_NAME_MISMATCH_URL + " for an explanation");
                }
            }
            return logger;
        }

    public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); // 此处 return iLoggerFactory.getLogger(name); }

    public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE == UNINITIALIZED) { synchronized (LoggerFactory.class) { if (INITIALIZATION_STATE == UNINITIALIZED) { INITIALIZATION_STATE = ONGOING_INITIALIZATION; performInitialization(); // 此处 } } } switch (INITIALIZATION_STATE) { case SUCCESSFUL_INITIALIZATION: return StaticLoggerBinder.getSingleton().getLoggerFactory(); case NOP_FALLBACK_INITIALIZATION: return NOP_FALLBACK_FACTORY; case FAILED_INITIALIZATION: throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); case ONGOING_INITIALIZATION: // support re-entrant behavior. // See also http://jira.qos.ch/browse/SLF4J-97 return SUBST_FACTORY; } throw new IllegalStateException("Unreachable code"); }

    private final static void performInitialization() { bind(); // 此处 if (INITIALIZATION_STATE == SUCCESSFUL_INITIALIZATION) { versionSanityCheck(); } }

    private final static void bind() { try { ... // skip check under android, see also // http://jira.qos.ch/browse/SLF4J-328 if (!isAndroid()) { staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet(); // 此处 reportMultipleBindingAmbiguity(staticLoggerBinderPathSet); } ... } catch () { ... } }

    static Set<URL> findPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves insertion order // during iteration Set<URL> staticLoggerBinderPathSet = new LinkedHashSet<URL>(); try { ClassLoader loggerFactoryClassLoader = LoggerFactory.class.getClassLoader(); Enumeration<URL> paths; if (loggerFactoryClassLoader == null) { paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH); } else { paths = loggerFactoryClassLoader.getResources(STATIC_LOGGER_BINDER_PATH); } while (paths.hasMoreElements()) { URL path = paths.nextElement(); staticLoggerBinderPathSet.add(path); } } catch (IOException ioe) { ... } return staticLoggerBinderPathSet; // 返回的size为零 }

      找到生成目录,缺少 logback-classic-1.2.3.jar

     最终发现是因为pom.xml中影响(这段代码直接从maven复制)

    最终是此句影响,还是基础不劳呀

  • 相关阅读:
    一种无法被Dump的jar包加密保护解决方案
    基于设备指纹零感验证系统
    IOS防作弊产品技术原理分析
    某移动端防作弊产品技术原理浅析与个人方案构想
    web安全防御之RASP技术
    Linux漏洞分析入门笔记-Off-By-One(栈)
    smb中继学习
    Dedecms sp2 5.7 后台getshell审计
    phpmyadmin后台代码执行分析复现
    静态恶意代码逃逸-学习一
  • 原文地址:https://www.cnblogs.com/Wicher-lsl/p/11227609.html
Copyright © 2020-2023  润新知