dblog.module 5.72 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
 
Dries committed
4 5 6 7
/**
 * @file
 * System monitoring and logging for administrators.
 *
8
 * The dblog module monitors your site and keeps a list of
Dries's avatar
 
Dries committed
9 10 11
 * recorded events containing usage and performance data, errors,
 * warnings, and similar operational information.
 *
12
 * @see watchdog()
Dries's avatar
 
Dries committed
13 14
 */

Dries's avatar
Dries committed
15 16 17
/**
 * Implementation of hook_help().
 */
18 19
function dblog_help($path, $arg) {
  switch ($path) {
20
    case 'admin/help#dblog':
21 22 23
      $output = '<p>' . t('The dblog module monitors your system, capturing system events in a log to be reviewed by an authorized individual at a later time. This is useful for site administrators who want a quick overview of activities on their site. The logs also record the sequence of events, so it can be useful for debugging site errors.') . '</p>';
      $output .= '<p>' . t('The dblog log is simply a list of recorded events containing usage data, performance data, errors, warnings and operational information. Administrators should check the dblog report on a regular basis to ensure their site is working properly.') . '</p>';
      $output .= '<p>' . t('For more information, see the online handbook entry for <a href="@dblog">Dblog module</a>.', array('@dblog' => 'http://drupal.org/handbook/modules/dblog/')) . '</p>';
24
      return $output;
25
    case 'admin/reports/dblog':
26
      return '<p>' . t('The dblog module monitors your website, capturing system events in a log to be reviewed by an authorized individual at a later time. The dblog log is simply a list of recorded events containing usage data, performance data, errors, warnings and operational information. It is vital to check the dblog report on a regular basis as it is often the only way to tell what is going on.') . '</p>';
Dries's avatar
 
Dries committed
27
  }
28 29
}

30
/**
31
 * Implementation of hook_theme().
32
 */
33
function dblog_theme() {
34
  return array(
35
    'dblog_filters' => array(
36 37 38 39 40
      'arguments' => array('form' => NULL),
    ),
  );
}

Dries's avatar
 
Dries committed
41
/**
Dries's avatar
 
Dries committed
42
 * Implementation of hook_menu().
Dries's avatar
 
Dries committed
43
 */
44 45
function dblog_menu() {
  $items['admin/settings/logging/dblog'] = array(
46 47
    'title' => 'Database logging',
    'description' => 'Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.',
48 49
    'page callback' => 'drupal_get_form',
    'page arguments' => array('dblog_admin_settings'),
50
    'access arguments' => array('administer site configuration'),
51
    'type' => MENU_LOCAL_TASK,
52
  );
53
  $items['admin/reports/dblog'] = array(
54 55
    'title' => 'Recent log entries',
    'description' => 'View events that have recently been logged.',
56
    'page callback' => 'dblog_overview',
57
    'access arguments' => array('access site reports'),
58 59
    'weight' => -1,
  );
60
  $items['admin/reports/page-not-found'] = array(
61 62
    'title' => "Top 'page not found' errors",
    'description' => "View 'page not found' errors (404s).",
63
    'page callback' => 'dblog_top',
64
    'page arguments' => array('page not found'),
65
    'access arguments' => array('access site reports'),
66
  );
67
  $items['admin/reports/access-denied'] = array(
68
    'title' => "Top 'access denied' errors",
69
    'description' => "View 'access denied' errors (403s).",
70
    'page callback' => 'dblog_top',
71
    'page arguments' => array('access denied'),
72
    'access arguments' => array('access site reports'),
73
  );
74
  $items['admin/reports/event/%'] = array(
75
    'title' => 'Details',
76
    'page callback' => 'dblog_event',
77
    'page arguments' => array(3),
78
    'access arguments' => array('access site reports'),
79 80 81 82
    'type' => MENU_CALLBACK,
  );
  return $items;
}
Dries's avatar
 
Dries committed
83

84
function dblog_init() {
85
  if (arg(0) == 'admin' && arg(1) == 'reports') {
86
    // Add the CSS for this module
87
    drupal_add_css(drupal_get_path('module', 'dblog') . '/dblog.css', array('preprocess' => FALSE));
88
  }
Dries's avatar
 
Dries committed
89 90
}

91 92


Dries's avatar
Dries committed
93 94 95
/**
 * Implementation of hook_cron().
 *
Dries's avatar
 
Dries committed
96
 * Remove expired log messages and flood control events.
Dries's avatar
Dries committed
97
 */
98 99
function dblog_cron() {
  // Cleanup the watchdog table
100
  $max = db_result(db_query('SELECT MAX(wid) FROM {watchdog}'));
101
  db_query('DELETE FROM {watchdog} WHERE wid <= %d', $max - variable_get('dblog_row_limit', 1000));
Dries's avatar
 
Dries committed
102
}
Dries's avatar
 
Dries committed
103

104
/**
105
 * Implementation of hook_user_cancel().
106
 */
107
function dblog_user_cancel($edit, $account, $method) {
108 109 110 111 112 113 114 115 116
  switch ($method) {
    case 'user_cancel_reassign':
      db_update('watchdog')->fields(array('uid' => 0))->condition('uid', $account->uid)->execute();
      break;

    case 'user_cancel_delete':
      db_delete('watchdog')->condition('uid', $account->uid)->execute();
      break;
  }
117 118
}

119
function _dblog_get_message_types() {
Dries's avatar
 
Dries committed
120 121
  $types = array();

122
  $result = db_query('SELECT DISTINCT(type) FROM {watchdog} ORDER BY type');
Dries's avatar
 
Dries committed
123 124 125 126 127 128
  while ($object = db_fetch_object($result)) {
    $types[] = $object->type;
  }

  return $types;
}
129

130 131 132 133 134 135
/**
 * Implementation of hook_watchdog().
 *
 * Note some values may be truncated for database column size restrictions.
 */
function dblog_watchdog(array $log_entry) {
136
  Database::getConnection('default', 'default')->insert('watchdog')
137
    ->fields(array(
138 139 140 141 142 143 144 145 146 147
      'uid' => $log_entry['user']->uid,
      'type' => substr($log_entry['type'], 0, 64),
      'message' => $log_entry['message'],
      'variables' => serialize($log_entry['variables']),
      'severity' => $log_entry['severity'],
      'link' => substr($log_entry['link'], 0, 255),
      'location' => $log_entry['request_uri'],
      'referer' => $log_entry['referer'],
      'hostname' => substr($log_entry['ip'], 0, 128),
      'timestamp' => $log_entry['timestamp'],
148 149
    ))
    ->execute();
150
}
151

152 153
/**
 * Theme dblog administration filter selector.
154 155
 *
 * @ingroup themeable
156 157 158 159 160 161
 */
function theme_dblog_filters($form) {
  $output = '';
  foreach (element_children($form['status']) as $key) {
    $output .= drupal_render($form['status'][$key]);
  }
162
  $output .= '<div id="dblog-admin-buttons">' . drupal_render($form['buttons']) . '</div>';
163 164
  return $output;
}