docs: public void configure(Properties props) {
          this.refreshCount.set(0);
          this.overrideProps.clear();
          
          this.originalAsyncAppenderNameMap.clear();
         // First try to load the log4j configuration file from the classpath
          String log4jConfigurationFile = System.getProperty(PROP_LOG4J_CONFIGURATION);
          
          NFHierarchy nfHierarchy = null;
          
          // Make log4j use blitz4j implementations
          if ((!NFHierarchy.class.equals(LogManager.getLoggerRepository().getClass()))) {
              nfHierarchy = new NFHierarchy(new NFRootLogger(org.apache.log4j.Level.INFO));
              org.apache.log4j.LogManager.setRepositorySelector(new NFRepositorySelector(nfHierarchy), guard);
          }
          
          String log4jLoggerFactory = System.getProperty(PROP_LOG4J_LOGGER_FACTORY);
          if (log4jLoggerFactory != null) {
              this.initialProps.setProperty(PROP_LOG4J_LOGGER_FACTORY, log4jLoggerFactory);
              if (nfHierarchy != null) {
                  try {
                      LoggerFactory loggerFactory = (LoggerFactory) Class.forName(log4jLoggerFactory).newInstance();
                      nfHierarchy.setLoggerFactory(loggerFactory);
                  } catch (Exception e) {
                      System.err.println("Cannot set the logger factory. Hence reverting to default.");
                      e.printStackTrace();
                  }
              }
          } else {
              this.initialProps.setProperty(PROP_LOG4J_LOGGER_FACTORY, BLITZ_LOGGER_FACTORY);
  
          }
          if (log4jConfigurationFile != null) {
              loadLog4jConfigurationFile(log4jConfigurationFile);
              // First configure without async so that we can capture the output
              // of dependent libraries
              clearAsyncAppenderList();
              PropertyConfigurator.configure(this.initialProps);
          }
  
          this.blitz4jConfig = new DefaultBlitz4jConfig(props);
  
          if ((log4jConfigurationFile == null) && (blitz4jConfig.shouldLoadLog4jPropertiesFromClassPath())) {
              try {
                  URL url = Loader.getResource(LOG4J_PROPERTIES);
                  if (url != null) {
                      try (InputStream in = url.openStream()) {
                          this.initialProps.load(in);
                      }
                  }
              } catch (Exception t) {
                  System.err.println("Error loading properties from " + LOG4J_PROPERTIES);
              } 
          }   
          
          Enumeration enumeration = props.propertyNames();
          while (enumeration.hasMoreElements()) {
              String key = (String) enumeration.nextElement();
              String propertyValue = props.getProperty(key);
              this.initialProps.setProperty(key, propertyValue);
          }
          
          this.blitz4jConfig = new DefaultBlitz4jConfig(this.initialProps);
      
          String[] asyncAppenderArray = blitz4jConfig.getAsyncAppenders();
          if (asyncAppenderArray == null) {
              return;
          }
          for (int i = 0; i < asyncAppenderArray.length; i++) {
              String oneAppenderName = asyncAppenderArray[i];
              if ((i == 0) || (oneAppenderName == null)) {
                  continue;
              }
              oneAppenderName = oneAppenderName.trim();
              String oneAsyncAppenderName = oneAppenderName + ASYNC_APPENDERNAME_SUFFIX;
              originalAsyncAppenderNameMap.put(oneAppenderName, oneAsyncAppenderName);
          }
          try {
              convertConfiguredAppendersToAsync(this.initialProps);
          } catch (Exception e) {
              throw new RuntimeException("Could not configure async appenders ",
                      e);
          }
          // Yes second time init required as properties would have been during async appender conversion
          this.blitz4jConfig = new DefaultBlitz4jConfig(this.initialProps);
          clearAsyncAppenderList();
          PropertyConfigurator.configure(this.initialProps);
          closeNonexistingAsyncAppenders();
          this.logger = org.slf4j.LoggerFactory.getLogger(LoggingConfiguration.class);
          ConfigurationManager.getConfigInstance().addConfigurationListener(
                  new ExpandedConfigurationListenerAdapter(this));
      }