I am trying to create a log record of searches made though my Search API View exposed form block in Drupal 9.

For some reason on a brand new search I get 2 duplicates (3 total entries), and it seems like I remember reading somewhere that the forms can be submitted multiple times. So I would like to know how I could eliminate that

Also, on searches for keywords that result in "no results" I am not seeing an entry in the log This behaviour seems hit and miss. I am using the following code with limited success:


    /**
     * Implements hook_form_views_exposed_form_alter().
     */
    function MY_form_views_exposed_form_alter(&$form, FormStateInterface &$form_state, $form_id) {
      // Create a search_log submission function for watchdog
      $view_names = array('search_api_view');
      $view = $form_state->getStorage('view');
      if ($form_id == 'views_exposed_form' && in_array($view['view']->id(), $view_names)) {
        if ($form['#id'] == 'views-exposed-form-search-api-view-page-1') {
          $form['#submit'][] = 'MY_search_api_log';
        }
      }
    }
    
    function MY_search_api_log(&$form, FormStateInterface $form_state) {
      if ($form_state->getValue('search_api_fulltext') != "") {
        // Create a link
        $link = Url::fromRoute('view.search_api_view.page_1', [], ['query' => ['search_api_fulltext' => $form_state->getValue('search_api_fulltext'), ], ]);
        // log the submission
        \Drupal::logger('search_api_results')->info($form_state->getValue('search_api_fulltext'), ['link' => Link::fromTextAndUrl('results', $link)->toString()]);
      }
    }

I am trying to convert this function from a hook I am using in D7 which works fine:

    /**
     * Implements hook_form_views_exposed_form_alter().
     */
    function MY_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
      if ($form_id == 'views_exposed_form' && $form['#id'] == 'views-exposed-form-search-api-view-page') {
        $form['search_api_views_fulltext']['#attributes']['placeholder'] = t('Search');
      }
      //Create a search_log submission function for watchdog
      if($form_state["view"]->base_field == 'search_api_id') {
        $form['#submit'][] = 'MY_search_api_log';
      }
    }
    
    function MY_search_api_log(&$form, $form_state) {
      if ($form_state['values']['search_api_views_fulltext'] != "") {
        $link = l('results', '/search-results', ['query' => ['search_api_views_fulltext' => $form_state['values']['search_api_views_fulltext'], ], ]);
        watchdog('search_api_results', $form_state['values']['search_api_views_fulltext'], [], WATCHDOG_INFO, $link);
      }
    }