docs: public static ILogger getLogger(String name) {
          // try the fast path first
          LoggerFactory existingFactory = loggerFactory;
          if (existingFactory != null) {
              return existingFactory.getLogger(name);
          }
  
          synchronized (FACTORY_LOCK) {
              existingFactory = loggerFactory;
              if (existingFactory != null) {
                  return existingFactory.getLogger(name);
              }
  
              LoggerFactory createdFactory = null;
  
              final String loggingClass = System.getProperty("hazelcast.logging.class");
              if (!StringUtil.isNullOrEmpty(loggingClass)) {
                  createdFactory = tryToCreateLoggerFactory(loggingClass);
              }
  
              if (createdFactory != null) {
                  // hazelcast.logging.class property overrides everything, so it's safe to store the factory for reuse
                  loggerFactory = createdFactory;
                  loggerFactoryClassOrType = loggingClass;
              } else {
                  final String loggingType = System.getProperty("hazelcast.logging.type");
                  createdFactory = createLoggerFactory(loggingType);
  
                  if (!StringUtil.isNullOrEmpty(loggingType)) {
                      // hazelcast.logging.type property is the recommended way of configuring the logging, in most setups
                      // the configured value should match with the value passed to newLoggerFactory(), so we store the created
                      // factory for reuse
                      loggerFactory = createdFactory;
                      loggerFactoryClassOrType = loggingType;
                  }
              }
  
              return createdFactory.getLogger(name);
          }
      }