' . t('About') . ''; $output .= '

' . t('The Database Logging module logs system events in the Drupal database. For more information, see the online documentation for the Database Logging module.', [':dblog' => 'https://www.drupal.org/documentation/modules/dblog']) . '

'; $output .= '

' . t('Uses') . '

'; $output .= '
'; $output .= '
' . t('Monitoring your site') . '
'; $output .= '
' . t('The Database Logging module allows you to view an event log on the Recent log messages page. The log is a chronological list of recorded events containing usage data, performance data, errors, warnings and operational information. Administrators should check the log on a regular basis to ensure their site is working properly.', [':dblog' => Url::fromRoute('dblog.overview')->toString()]) . '
'; $output .= '
' . t('Debugging site problems') . '
'; $output .= '
' . t('In case of errors or problems with the site, the Recent log messages page can be useful for debugging, since it shows the sequence of events. The log messages include usage information, warnings, and errors.', [':dblog' => Url::fromRoute('dblog.overview')->toString()]) . '
'; $output .= '
' . t('This log is not persistent') . '
'; $output .= '
' . t('The Database Logging module logs may be cleared by administrators and automated cron tasks, so they should not be used for forensic logging. For forensic purposes, use the Syslog module.', [':audit_trail_wiki' => 'https://en.wikipedia.org/wiki/Audit_trail']) . '
'; $output .= '
'; return $output; case 'dblog.overview': return '

' . t('The Database Logging module logs system events in the Drupal database. Monitor your site or debug site problems on this page.') . '

'; } } /** * Implements hook_menu_links_discovered_alter(). */ function dblog_menu_links_discovered_alter(&$links) { if (\Drupal::moduleHandler()->moduleExists('search')) { $links['dblog.search'] = [ 'title' => new TranslatableMarkup('Top search phrases'), 'route_name' => 'dblog.search', 'description' => new TranslatableMarkup('View most popular search phrases.'), 'parent' => 'system.admin_reports', ]; } return $links; } /** * Implements hook_cron(). * * Controls the size of the log table, paring it to 'dblog_row_limit' messages. */ function dblog_cron() { // Cleanup the watchdog table. $row_limit = \Drupal::config('dblog.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) { $connection = \Drupal::database(); $min_row = $connection->select('watchdog', 'w') ->fields('w', ['wid']) ->orderBy('wid', 'DESC') ->range($row_limit - 1, 1) ->execute()->fetchField(); // Delete all table entries older than the nth row, if nth row was found. if ($min_row) { $connection->delete('watchdog') ->condition('wid', $min_row, '<') ->execute(); } } } /** * Gathers a list of uniquely defined database log message types. * * @return array * List of uniquely defined database log message types. */ function _dblog_get_message_types() { return \Drupal::database()->query('SELECT DISTINCT([type]) FROM {watchdog} ORDER BY [type]') ->fetchAllKeyed(0, 0); } /** * Implements hook_form_FORM_ID_alter() for system_logging_settings(). */ function dblog_form_system_logging_settings_alter(&$form, FormStateInterface $form_state) { $row_limits = [100, 1000, 10000, 100000, 1000000]; $form['dblog_row_limit'] = [ '#type' => 'select', '#title' => t('Database log messages to keep'), '#default_value' => \Drupal::configFactory()->getEditable('dblog.settings')->get('row_limit'), '#options' => [0 => t('All')] + array_combine($row_limits, $row_limits), '#description' => t('The maximum number of messages to keep in the database log. Requires a cron maintenance task.', [':cron' => Url::fromRoute('system.status')->toString()]), ]; $form['#submit'][] = 'dblog_logging_settings_submit'; } /** * Form submission handler for system_logging_settings(). * * @see dblog_form_system_logging_settings_alter() */ function dblog_logging_settings_submit($form, FormStateInterface $form_state) { \Drupal::configFactory()->getEditable('dblog.settings')->set('row_limit', $form_state->getValue('dblog_row_limit'))->save(); } /** * Implements hook_views_pre_render(). */ function dblog_views_pre_render(ViewExecutable $view) { if (isset($view) && ($view->storage->get('base_table') == 'watchdog')) { $view->element['#attached']['library'][] = 'dblog/drupal.dblog'; } }