diff -u b/modules/redirect_404/config/install/redirect_404.settings.yml b/modules/redirect_404/config/install/redirect_404.settings.yml --- b/modules/redirect_404/config/install/redirect_404.settings.yml +++ b/modules/redirect_404/config/install/redirect_404.settings.yml @@ -1 +1 @@ -row_limit: 100 +row_limit: 3 diff -u b/modules/redirect_404/redirect_404.module b/modules/redirect_404/redirect_404.module --- b/modules/redirect_404/redirect_404.module +++ b/modules/redirect_404/redirect_404.module @@ -4,7 +4,9 @@ * @file * Cleanup 404 errors dblog for path that has already a redirect assigned. */ + use Drupal\language\Entity\ConfigurableLanguage; +use Drupal\Core\Form\FormStateInterface; /** * @defgroup redirect_api Redirection API @@ -32,0 +35,56 @@ + +/** + * Implements hook_cron(). + * + * Controls the size of the log table, paring it to 'dblog_row_limit' messages. + */ +function redirect_404_cron() { + // Cleanup the watchdog table. + $row_limit = \Drupal::config('redirect_404.settings')->get('row_limit'); + + // For row limit n, get the wid of the nth row in descending wid order. + // Counting the most recent n rows avoids issues with wid number sequences, + // e.g. auto_increment value > 1 or rows deleted directly from the table. + if ($row_limit > 0) { + $query = \Drupal::database()->select('redirect_404', 'r404') + ->extend('Drupal\Core\Database\Query\TableSortExtender') + ->orderBy('count', 'DESC') + ->orderBy('timestamp', 'DESC') + ->extend('Drupal\Core\Database\Query\PagerSelectExtender') + ->limit($row_limit - 1) + ->fields('r404', ['timestamp']) + ->execute()->fetchField(); + + // Delete all table entries older than the nth row, if nth row was found. + if ($query) { + \Drupal::database()->delete('redirect_404') + ->condition('timestamp', $query, '<') + ->execute(); + } + } +} + +/** + * Implements hook_form_FORM_ID_alter() for system_logging_settings(). + */ +function redirect_404_form_system_logging_settings_alter(&$form, FormStateInterface $form_state) { + $row_limits = [100, 1000, 10000, 100000, 1000000]; + $form['dblog_row_limit'] = [ + '#type' => 'select', + '#title' => t('404 error database logs to keep'), + '#default_value' => \Drupal::configFactory()->getEditable('redirect_404.settings')->get('row_limit'), + '#options' => [0 => t('All')] + array_combine($row_limits, $row_limits), + '#description' => t('The maximum number of 404 error logs to keep in the database log. Requires a cron maintenance task.', [':cron' => \Drupal::url('system.status')]) + ]; + + $form['#submit'][] = 'redirect_404_logging_settings_submit'; +} + +/** + * Form submission handler for system_logging_settings(). + * + * @see redirect_404_form_system_logging_settings_alter() + */ +function redirect_404_logging_settings_submit($form, FormStateInterface $form_state) { + \Drupal::configFactory()->getEditable('redirect_404.settings')->set('row_limit', $form_state->getValue('dblog_row_limit'))->save(); +}