dblog.module 5.28 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
  );
52
  $items['admin/reports/dblog'] = array(
53 54
    'title' => 'Recent log entries',
    'description' => 'View events that have recently been logged.',
55
    'page callback' => 'dblog_overview',
56
    'access arguments' => array('access site reports'),
57 58
    'weight' => -1,
  );
59
  $items['admin/reports/page-not-found'] = array(
60 61
    'title' => "Top 'page not found' errors",
    'description' => "View 'page not found' errors (404s).",
62
    'page callback' => 'dblog_top',
63
    'page arguments' => array('page not found'),
64
    'access arguments' => array('access site reports'),
65
  );
66
  $items['admin/reports/access-denied'] = array(
67
    'title' => "Top 'access denied' errors",
68
    'description' => "View 'access denied' errors (403s).",
69
    'page callback' => 'dblog_top',
70
    'page arguments' => array('access denied'),
71
    'access arguments' => array('access site reports'),
72
  );
73
  $items['admin/reports/event/%'] = array(
74
    'title' => 'Details',
75
    'page callback' => 'dblog_event',
76
    'page arguments' => array(3),
77
    'access arguments' => array('access site reports'),
78 79 80 81
    'type' => MENU_CALLBACK,
  );
  return $items;
}
Dries's avatar
 
Dries committed
82

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

90 91


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

103
/**
104
 * Implementation of hook_user_delete().
105
 */
106 107
function dblog_user_delete(&$edit, &$user) {
  db_query('UPDATE {watchdog} SET uid = 0 WHERE uid = %d', $user->uid);
108 109
}

110
function _dblog_get_message_types() {
Dries's avatar
 
Dries committed
111 112
  $types = array();

113
  $result = db_query('SELECT DISTINCT(type) FROM {watchdog} ORDER BY type');
Dries's avatar
 
Dries committed
114 115 116 117 118 119
  while ($object = db_fetch_object($result)) {
    $types[] = $object->type;
  }

  return $types;
}
120 121 122 123

function dblog_watchdog($log = array()) {
  $current_db = db_set_active();
  db_query("INSERT INTO {watchdog}
124
    (uid, type, message, variables, severity, link, location, referer, hostname, timestamp)
125
    VALUES
126
    (%d, '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', %d)",
127 128 129
    $log['user']->uid,
    $log['type'],
    $log['message'],
130
    serialize($log['variables']),
131 132 133 134 135
    $log['severity'],
    $log['link'],
    $log['request_uri'],
    $log['referer'],
    $log['ip'],
136 137
    $log['timestamp']
  );
138 139 140 141 142

  if ($current_db) {
    db_set_active($current_db);
  }
}
143

144 145
/**
 * Theme dblog administration filter selector.
146 147
 *
 * @ingroup themeable
148 149 150 151 152 153
 */
function theme_dblog_filters($form) {
  $output = '';
  foreach (element_children($form['status']) as $key) {
    $output .= drupal_render($form['status'][$key]);
  }
154
  $output .= '<div id="dblog-admin-buttons">' . drupal_render($form['buttons']) . '</div>';
155 156 157
  return $output;
}