webmaster@1: 'select', webmaster@1: '#title' => t('Discard log entries above the following row limit'), webmaster@1: '#default_value' => variable_get('dblog_row_limit', 1000), webmaster@1: '#options' => drupal_map_assoc(array(100, 1000, 10000, 100000, 1000000)), webmaster@1: '#description' => t('The maximum number of rows to keep in the database log. Older entries will be automatically discarded. (Requires a correctly configured cron maintenance task.)', array('@cron' => url('admin/reports/status'))) webmaster@1: ); webmaster@1: webmaster@1: return system_settings_form($form); webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Menu callback; displays a listing of log messages. webmaster@1: */ webmaster@1: function dblog_overview() { webmaster@1: $filter = dblog_build_filter_query(); webmaster@1: $rows = array(); webmaster@1: $icons = array( webmaster@11: WATCHDOG_DEBUG => '', webmaster@11: WATCHDOG_INFO => '', webmaster@11: WATCHDOG_NOTICE => '', webmaster@11: WATCHDOG_WARNING => theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')), webmaster@11: WATCHDOG_ERROR => theme('image', 'misc/watchdog-error.png', t('error'), t('error')), webmaster@11: WATCHDOG_CRITICAL => theme('image', 'misc/watchdog-error.png', t('critical'), t('critical')), webmaster@11: WATCHDOG_ALERT => theme('image', 'misc/watchdog-error.png', t('alert'), t('alert')), webmaster@11: WATCHDOG_EMERG => theme('image', 'misc/watchdog-error.png', t('emergency'), t('emergency')), webmaster@1: ); webmaster@1: $classes = array( webmaster@11: WATCHDOG_DEBUG => 'dblog-debug', webmaster@11: WATCHDOG_INFO => 'dblog-info', webmaster@11: WATCHDOG_NOTICE => 'dblog-notice', webmaster@11: WATCHDOG_WARNING => 'dblog-warning', webmaster@11: WATCHDOG_ERROR => 'dblog-error', webmaster@11: WATCHDOG_CRITICAL => 'dblog-critical', webmaster@11: WATCHDOG_ALERT => 'dblog-alert', webmaster@11: WATCHDOG_EMERG => 'dblog-emerg', webmaster@1: ); webmaster@1: webmaster@1: $output = drupal_get_form('dblog_filter_form'); webmaster@1: webmaster@1: $header = array( webmaster@1: ' ', webmaster@1: array('data' => t('Type'), 'field' => 'w.type'), webmaster@1: array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'), webmaster@1: t('Message'), webmaster@1: array('data' => t('User'), 'field' => 'u.name'), webmaster@1: array('data' => t('Operations')), webmaster@1: ); webmaster@1: webmaster@1: $sql = "SELECT w.wid, w.uid, w.severity, w.type, w.timestamp, w.message, w.variables, w.link, u.name FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid"; webmaster@1: $tablesort = tablesort_sql($header); webmaster@1: if (!empty($filter['where'])) { webmaster@1: $result = pager_query($sql ." WHERE ". $filter['where'] . $tablesort, 50, 0, NULL, $filter['args']); webmaster@1: } webmaster@1: else { webmaster@1: $result = pager_query($sql . $tablesort, 50); webmaster@1: } webmaster@1: webmaster@1: while ($dblog = db_fetch_object($result)) { webmaster@1: $rows[] = array('data' => webmaster@1: array( webmaster@1: // Cells webmaster@1: $icons[$dblog->severity], webmaster@1: t($dblog->type), webmaster@1: format_date($dblog->timestamp, 'small'), webmaster@1: l(truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE), 'admin/reports/event/'. $dblog->wid, array('html' => TRUE)), webmaster@1: theme('username', $dblog), webmaster@1: $dblog->link, webmaster@1: ), webmaster@1: // Attributes for tr webmaster@1: 'class' => "dblog-". preg_replace('/[^a-z]/i', '-', $dblog->type) .' '. $classes[$dblog->severity] webmaster@1: ); webmaster@1: } webmaster@1: webmaster@1: if (!$rows) { webmaster@1: $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 6)); webmaster@1: } webmaster@1: webmaster@1: $output .= theme('table', $header, $rows, array('id' => 'admin-dblog')); webmaster@1: $output .= theme('pager', NULL, 50, 0); webmaster@1: webmaster@1: return $output; webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Menu callback; generic function to display a page of the most frequent webmaster@1: * dblog events of a specified type. webmaster@1: */ webmaster@1: function dblog_top($type) { webmaster@1: webmaster@1: $header = array( webmaster@1: array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'), webmaster@1: array('data' => t('Message'), 'field' => 'message') webmaster@1: ); webmaster@1: webmaster@1: $result = pager_query("SELECT COUNT(wid) AS count, message, variables FROM {watchdog} WHERE type = '%s' GROUP BY message, variables ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(message)) FROM {watchdog} WHERE type = '%s'", $type); webmaster@1: webmaster@1: $rows = array(); webmaster@1: while ($dblog = db_fetch_object($result)) { webmaster@1: $rows[] = array($dblog->count, truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE)); webmaster@1: } webmaster@1: webmaster@1: if (empty($rows)) { webmaster@1: $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 2)); webmaster@1: } webmaster@1: webmaster@1: $output = theme('table', $header, $rows); webmaster@1: $output .= theme('pager', NULL, 30, 0); webmaster@1: webmaster@1: return $output; webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Menu callback; displays details about a log message. webmaster@1: */ webmaster@1: function dblog_event($id) { webmaster@1: $severity = watchdog_severity_levels(); webmaster@1: $output = ''; webmaster@1: $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = %d', $id); webmaster@1: if ($dblog = db_fetch_object($result)) { webmaster@1: $rows = array( webmaster@1: array( webmaster@1: array('data' => t('Type'), 'header' => TRUE), webmaster@1: t($dblog->type), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Date'), 'header' => TRUE), webmaster@1: format_date($dblog->timestamp, 'large'), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('User'), 'header' => TRUE), webmaster@1: theme('username', $dblog), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Location'), 'header' => TRUE), webmaster@1: l($dblog->location, $dblog->location), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Referrer'), 'header' => TRUE), webmaster@1: l($dblog->referer, $dblog->referer), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Message'), 'header' => TRUE), webmaster@1: _dblog_format_message($dblog), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Severity'), 'header' => TRUE), webmaster@1: $severity[$dblog->severity], webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Hostname'), 'header' => TRUE), webmaster@1: check_plain($dblog->hostname), webmaster@1: ), webmaster@1: array( webmaster@1: array('data' => t('Operations'), 'header' => TRUE), webmaster@1: $dblog->link, webmaster@1: ), webmaster@1: ); webmaster@1: $attributes = array('class' => 'dblog-event'); webmaster@1: $output = theme('table', array(), $rows, $attributes); webmaster@1: } webmaster@1: return $output; webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Build query for dblog administration filters based on session. webmaster@1: */ webmaster@1: function dblog_build_filter_query() { webmaster@1: if (empty($_SESSION['dblog_overview_filter'])) { webmaster@1: return; webmaster@1: } webmaster@1: webmaster@1: $filters = dblog_filters(); webmaster@1: webmaster@1: // Build query webmaster@1: $where = $args = array(); webmaster@1: foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) { webmaster@1: $filter_where = array(); webmaster@1: foreach ($filter as $value) { webmaster@1: $filter_where[] = $filters[$key]['where']; webmaster@1: $args[] = $value; webmaster@1: } webmaster@1: if (!empty($filter_where)) { webmaster@1: $where[] = '('. implode(' OR ', $filter_where) .')'; webmaster@1: } webmaster@1: } webmaster@1: $where = !empty($where) ? implode(' AND ', $where) : ''; webmaster@1: webmaster@1: return array( webmaster@1: 'where' => $where, webmaster@1: 'args' => $args, webmaster@1: ); webmaster@1: } webmaster@1: webmaster@1: webmaster@1: /** webmaster@1: * List dblog administration filters that can be applied. webmaster@1: */ webmaster@1: function dblog_filters() { webmaster@1: $filters = array(); webmaster@1: webmaster@1: foreach (_dblog_get_message_types() as $type) { webmaster@1: $types[$type] = $type; webmaster@1: } webmaster@1: webmaster@1: if (!empty($types)) { webmaster@1: $filters['type'] = array( webmaster@1: 'title' => t('Type'), webmaster@1: 'where' => "w.type = '%s'", webmaster@1: 'options' => $types, webmaster@1: ); webmaster@1: } webmaster@1: webmaster@1: $filters['severity'] = array( webmaster@1: 'title' => t('Severity'), webmaster@1: 'where' => 'w.severity = %d', webmaster@1: 'options' => watchdog_severity_levels(), webmaster@1: ); webmaster@1: webmaster@1: return $filters; webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Formats a log message for display. webmaster@1: * webmaster@1: * @param $dblog webmaster@1: * An object with at least the message and variables properties webmaster@1: */ webmaster@1: function _dblog_format_message($dblog) { webmaster@1: // Legacy messages and user specified text webmaster@1: if ($dblog->variables === 'N;') { webmaster@1: return $dblog->message; webmaster@1: } webmaster@1: // Message to translate with injected variables webmaster@1: else { webmaster@1: return t($dblog->message, unserialize($dblog->variables)); webmaster@1: } webmaster@1: } webmaster@1: webmaster@1: webmaster@1: /** webmaster@1: * Return form for dblog administration filters. webmaster@1: * webmaster@1: * @ingroup forms webmaster@1: * @see dblog_filter_form_submit() webmaster@1: * @see dblog_filter_form_validate() webmaster@1: */ webmaster@1: function dblog_filter_form() { webmaster@1: $session = &$_SESSION['dblog_overview_filter']; webmaster@1: $session = is_array($session) ? $session : array(); webmaster@1: $filters = dblog_filters(); webmaster@1: webmaster@1: $form['filters'] = array( webmaster@1: '#type' => 'fieldset', webmaster@1: '#title' => t('Filter log messages'), webmaster@1: '#theme' => 'dblog_filters', webmaster@1: '#collapsible' => TRUE, webmaster@1: '#collapsed' => empty($session), webmaster@1: ); webmaster@1: foreach ($filters as $key => $filter) { webmaster@1: $form['filters']['status'][$key] = array( webmaster@1: '#title' => $filter['title'], webmaster@1: '#type' => 'select', webmaster@1: '#multiple' => TRUE, webmaster@1: '#size' => 8, webmaster@1: '#options' => $filter['options'], webmaster@1: ); webmaster@1: if (!empty($session[$key])) { webmaster@1: $form['filters']['status'][$key]['#default_value'] = $session[$key]; webmaster@1: } webmaster@1: } webmaster@1: webmaster@1: $form['filters']['buttons']['submit'] = array( webmaster@1: '#type' => 'submit', webmaster@1: '#value' => t('Filter'), webmaster@1: ); webmaster@1: if (!empty($session)) { webmaster@1: $form['filters']['buttons']['reset'] = array( webmaster@1: '#type' => 'submit', webmaster@1: '#value' => t('Reset') webmaster@1: ); webmaster@1: } webmaster@1: webmaster@1: return $form; webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Validate result from dblog administration filter form. webmaster@1: */ webmaster@1: function dblog_filter_form_validate($form, &$form_state) { webmaster@1: if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) { webmaster@1: form_set_error('type', t('You must select something to filter by.')); webmaster@1: } webmaster@1: } webmaster@1: webmaster@1: /** webmaster@1: * Process result from dblog administration filter form. webmaster@1: */ webmaster@1: function dblog_filter_form_submit($form, &$form_state) { webmaster@1: $op = $form_state['values']['op']; webmaster@1: $filters = dblog_filters(); webmaster@1: switch ($op) { webmaster@1: case t('Filter'): webmaster@1: foreach ($filters as $name => $filter) { webmaster@1: if (isset($form_state['values'][$name])) { webmaster@1: $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name]; webmaster@1: } webmaster@1: } webmaster@1: break; webmaster@1: case t('Reset'): webmaster@1: $_SESSION['dblog_overview_filter'] = array(); webmaster@1: break; webmaster@1: } webmaster@1: return 'admin/reports/dblog'; webmaster@1: }