docs: public static String getString(String key, @CheckForNull String def, Level logLevel) {
          String value = System.getProperty(key); // keep passing on any exceptions
          if (value != null) {
              if (LOGGER.isLoggable(logLevel)) {
                  LOGGER.log(logLevel, "Property (system): {0} => {1}", new Object[] {key, value});
              }
              return value;
          } 
          
          value = handler.getString(key);
          if (value != null) {
              if (LOGGER.isLoggable(logLevel)) {
                  LOGGER.log(logLevel, "Property (context): {0} => {1}", new Object[]{key, value});
              }
              return value;
          }
          
          value = def;
          if (LOGGER.isLoggable(logLevel)) {
              LOGGER.log(logLevel, "Property (default): {0} => {1}", new Object[] {key, value});
          }
          return value;
      }