Commit 07e6bdcd authored by Dries's avatar Dries

- Patch #63881 by kbahey and jakeg: improved Drupal's logging functionality. ...

- Patch #63881 by kbahey and jakeg: improved Drupal's logging functionality.  Added support for external loggers, and included a small syslog module into core.
parent ded653fb
......@@ -2,6 +2,11 @@
Drupal 6.0, xxxx-xx-xx (development version)
----------------------
- New watchdog as a hook functionality.
* New hook_watchdog that can be implemented by any module to route log messages to various destinations.
* Expands the severity levels from 3 (Error, Warning, Notice) to the 8 levels defined in RFC 3164.
* The watchdog module is now called dblog, and is optional, but enabled by default in the default install profile.
* New optional syslog.module now in core.
- Added theme registry: modules can directly provide .tpl.php files for their themes without having to create theme_ functions.
- Added versioning support to node terms.
- Made it easier to theme the forum overview page.
......
......@@ -35,22 +35,17 @@
define('CACHE_AGGRESSIVE', 2);
/**
* Indicates a notice-level watchdog event; these are normally notifications
* of normal system events that have occurred and can usually be safely ignored.
*/
define('WATCHDOG_NOTICE', 0);
/**
* Indicates a warning-level watchdog event; this can be triggered by an error
* in a module that does not impact the overall functionality of the site.
*/
define('WATCHDOG_WARNING', 1);
/**
* Indicates an error-level watchdog event; could be indicative of an attempt
* to compromise the security of the site, or a serious system error.
*
* Severity levels, as defined in RFC 3164 http://www.faqs.org/rfcs/rfc3164.html
*/
define('WATCHDOG_ERROR', 2);
define('WATCHDOG_EMERG', 0); // Emergency: system is unusable
define('WATCHDOG_ALERT', 1); // Alert: action must be taken immediately
define('WATCHDOG_CRITICAL', 2); // Critical: critical conditions
define('WATCHDOG_ERROR', 3); // Error: error conditions
define('WATCHDOG_WARNING', 4); // Warning: warning conditions
define('WATCHDOG_NOTICE', 5); // Notice: normal but significant condition
define('WATCHDOG_INFO', 6); // Informational: informational messages
define('WATCHDOG_DEBUG', 7); // Debug: debug-level messages
/**
* First bootstrap phase: initialize configuration.
......@@ -649,25 +644,29 @@ function request_uri() {
* @param $message
* The message to store in the log.
* @param $severity
* The severity of the message. One of the following values:
* - WATCHDOG_NOTICE
* - WATCHDOG_WARNING
* - WATCHDOG_ERROR
* The severity of the message, as per RFC 3164
* @param $link
* A link to associate with the message.
*/
function watchdog($type, $message, $severity = WATCHDOG_NOTICE, $link = NULL) {
global $user, $base_root;
$current_db = db_set_active();
// Note: log the exact, entire absolute URL.
$request_uri = $base_root . request_uri();
db_query("INSERT INTO {watchdog} (uid, type, message, severity, link, location, referer, hostname, timestamp) VALUES (%d, '%s', '%s', %d, '%s', '%s', '%s', '%s', %d)", $user->uid, $type, $message, $severity, $link, $request_uri, referer_uri(), $_SERVER['REMOTE_ADDR'], time());
if ($current_db) {
db_set_active($current_db);
// Prepare the fields to be logged
$log_message = array(
'type' => $type,
'message' => $message,
'severity' => $severity,
'link' => $link,
'user' => $user,
'request_uri' => $base_root . request_uri(),
'referer' => referer_uri(),
'ip' => $_SERVER['REMOTE_ADDR'],
'timestamp' => time(),
);
// Call the logging hooks to log/process the message
foreach (module_implements('watchdog', TRUE) as $module) {
module_invoke($module, 'watchdog', $log_message);
}
}
......
......@@ -423,5 +423,5 @@ function module_invoke_all() {
* Array of modules required by core.
*/
function drupal_required_modules() {
return array('block', 'filter', 'node', 'system', 'user', 'watchdog');
return array('block', 'filter', 'node', 'system', 'user');
}
/* $Id$ */
tr.watchdog-user {
tr.dblog-user {
background: #ffd;
}
tr.watchdog-user .active {
tr.dblog-user .active {
background: #eed;
}
tr.watchdog-content {
tr.dblog-content {
background: #ddf;
}
tr.watchdog-content .active {
tr.dblog-content .active {
background: #cce;
}
tr.watchdog-page-not-found, tr.watchdog-access-denied {
tr.dblog-page-not-found, tr.dblog-access-denied {
background: #dfd;
}
tr.watchdog-page-not-found .active, tr.watchdog-access-denied .active {
tr.dblog-page-not-found .active, tr.dblog-access-denied .active {
background: #cec;
}
tr.watchdog-error {
tr.dblog-error {
background: #ffc9c9;
}
tr.watchdog-error .active {
tr.dblog-error .active {
background: #eeb9b9;
}
; $Id$
name = Database logging
description = Logs and records system events to the database.
package = Core - optional
version = VERSION
<?php
// $Id$
/**
* Implementation of hook_install().
*/
function dblog_install() {
switch ($GLOBALS['db_type']) {
case 'mysql':
case 'mysqli':
db_query("CREATE TABLE {watchdog} (
wid int NOT NULL auto_increment,
uid int NOT NULL default '0',
type varchar(16) NOT NULL default '',
message longtext NOT NULL,
severity tinyint unsigned NOT NULL default '0',
link varchar(255) NOT NULL default '',
location text NOT NULL,
referer varchar(128) NOT NULL default '',
hostname varchar(128) NOT NULL default '',
timestamp int NOT NULL default '0',
PRIMARY KEY (wid),
KEY (type)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
break;
case 'pgsql':
db_query("CREATE TABLE {watchdog} (
wid serial,
uid int NOT NULL default '0',
type varchar(16) NOT NULL default '',
message text NOT NULL,
severity smallint_unsigned NOT NULL default '0',
link varchar(255) NOT NULL default '',
location text NOT NULL default '',
referer varchar(128) NOT NULL default '',
hostname varchar(128) NOT NULL default '',
timestamp int NOT NULL default '0',
PRIMARY KEY (wid)
)");
db_query("CREATE INDEX {watchdog}_type_idx ON {watchdog} (type)");
break;
}
}
/**
* Implementation of hook_uninstall().
*/
function dblog_uninstall() {
db_query('DROP TABLE {watchdog}');
}
; $Id$
name = Syslog
description = Logs and records system events to syslog.
package = Core - optional
version = VERSION
<?php
// $Id$
/**
* @file
* Redirects logging messages to syslog.
*/
/**
* Implementation of hook_help().
*/
function syslog_help($section) {
switch ($section) {
case 'admin/help#syslog':
return '<p>'. t('Provides the facility to log Drupal messages to the operating systems\' syslog facility.') .'</p>';
}
}
function syslog_menu() {
$items['admin/settings/logging/syslog'] = array(
'title' => t('Syslog'),
'description' => t('Settings for syslog logging.'),
'page callback' => 'drupal_get_form',
'page arguments' => array('syslog_admin_settings'),
);
return $items;
}
function syslog_admin_settings() {
$form['syslog_faclity'] = array(
'#type' => 'select',
'#title' => t('Syslog facility to send to'),
'#default_value' => variable_get('syslog_faclity', LOG_LOCAL0),
'#options' => syslog_facility_list(),
'#description' => t('Select the syslog facility to send Drupal\'s messages to. For more information on syslog facilities, See !syslog_conf and !php', array(
'!php' => l("PHP's syslog", 'http://www.php.net/manual/en/function.openlog.php'),
'!syslog_conf' => l('UNIX/Linux syslog.conf', 'http://www.rt.com/man/syslog.5.html'),
)),
);
return system_settings_form($form);
}
function syslog_facility_list() {
return array(
LOG_USER => t('LOG_USER - User level messages. Use this for Windows.'),
LOG_LOCAL0 => t('LOG_LOCAL0 - Local 0'),
LOG_LOCAL1 => t('LOG_LOCAL1 - Local 1'),
LOG_LOCAL2 => t('LOG_LOCAL2 - Local 2'),
LOG_LOCAL3 => t('LOG_LOCAL3 - Local 3'),
LOG_LOCAL4 => t('LOG_LOCAL4 - Local 4'),
LOG_LOCAL5 => t('LOG_LOCAL5 - Local 5'),
LOG_LOCAL6 => t('LOG_LOCAL6 - Local 6'),
LOG_LOCAL7 => t('LOG_LOCAL7 - Local 7'),
);
}
function syslog_watchdog($entry) {
static $log_init = FALSE;
if (!$log_init) {
$log_init = TRUE;
openlog('drupal', LOG_NDELAY, variable_get('syslog_faclity', LOG_LOCAL0));
}
syslog($entry['severity'], theme('syslog_format', $entry));
}
function syslog_theme() {
return array(
'syslog_format' => array(
'arguments' => array('entry' => NULL),
),
);
}
function theme_syslog_format($entry) {
global $base_url;
$message = t('@base_url|@timestamp|@type|@uid|@ip|@request_uri|@referer_uri|@link|@message',
array(
'@base_url' => $base_url,
'@timestamp' => $entry['timestamp'],
'@type' => $entry['type'],
'@ip' => $entry['ip'],
'@request_uri' => $entry['request_uri'],
'@referer_uri' => $entry['referer'],
'@uid' => $entry['user']->uid,
'@link' => strip_tags($entry['link']),
'@message' => strip_tags($entry['message']),
));
return $message;
}
......@@ -603,21 +603,6 @@ function system_install() {
PRIMARY KEY (vid, type)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
db_query("CREATE TABLE {watchdog} (
wid int NOT NULL auto_increment,
uid int NOT NULL default '0',
type varchar(16) NOT NULL default '',
message longtext NOT NULL,
severity tinyint unsigned NOT NULL default '0',
link varchar(255) NOT NULL default '',
location text NOT NULL,
referer varchar(128) NOT NULL default '',
hostname varchar(128) NOT NULL default '',
timestamp int NOT NULL default '0',
PRIMARY KEY (wid),
KEY (type)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
break;
case 'pgsql':
/* create unsigned types */
......@@ -1089,20 +1074,6 @@ function system_install() {
PRIMARY KEY (vid, type)
)");
db_query("CREATE TABLE {watchdog} (
wid serial,
uid int NOT NULL default '0',
type varchar(16) NOT NULL default '',
message text NOT NULL,
severity smallint_unsigned NOT NULL default '0',
link varchar(255) NOT NULL default '',
location text NOT NULL default '',
referer varchar(128) NOT NULL default '',
hostname varchar(128) NOT NULL default '',
timestamp int NOT NULL default '0',
PRIMARY KEY (wid)
)");
db_query("CREATE INDEX {watchdog}_type_idx ON {watchdog} (type)");
break;
}
......@@ -3723,6 +3694,17 @@ function system_update_2006() {
return $ret;
}
/**
* Change the severity column in the watchdog table to the new values.
*/
function system_update_2007() {
$ret = array();
$ret[] = update_sql("UPDATE {watchdog} SET severity = %d WHERE severity = 0", WATCHDOG_NOTICE);
$ret[] = update_sql("UPDATE {watchdog} SET severity = %d WHERE severity = 1", WATCHDOG_WARNING);
$ret[] = update_sql("UPDATE {watchdog} SET severity = %d WHERE severity = 2", WATCHDOG_ERROR);
return $ret;
}
/**
* @} End of "defgroup updates-5.0-to-x.x"
* The next series of updates should start at 3000.
......
......@@ -249,6 +249,11 @@ function system_menu() {
'page callback' => 'drupal_get_form',
'page arguments' => array('system_error_reporting_settings'),
);
$items['admin/settings/logging'] = array(
'title' => t('Logging and alerts'),
'description' => t('Settings for logging and alerts modules'),
'page callback' => 'system_logging_overview',
);
$items['admin/settings/performance'] = array(
'title' => t('Performance'),
'description' => t('Enable or disable page caching for anonymous users, and enable or disable CSS preprocessor.'),
......@@ -669,16 +674,6 @@ function system_error_reporting_settings() {
'#description' => t('Where Drupal, PHP and SQL errors are logged. On a production server it is recommended that errors are only written to the error log. On a test server it can be helpful to write logs to the screen.')
);
$period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
$period['1000000000'] = t('Never');
$form['watchdog_clear'] = array(
'#type' => 'select',
'#title' => t('Discard log entries older than'),
'#default_value' => variable_get('watchdog_clear', 604800),
'#options' => $period,
'#description' => t('The time log entries should be kept. Older entries will be automatically discarded. Requires crontab.')
);
return system_settings_form($form);
}
......@@ -1953,6 +1948,14 @@ function system_settings_overview() {
return $output;
}
function system_logging_overview() {
$item = menu_get_item('admin/settings/logging');
$content = system_admin_menu_block($item);
$output = theme('admin_block_content', $content);
return $output;
}
/**
* Menu callback; display theme configuration for entire site and individual themes.
*/
......@@ -2431,3 +2434,14 @@ function theme_system_admin_by_module($menu_items) {
return $output;
}
/**
* Implementation of hook_cron().
*
* Remove older rows from flood table
*/
function system_cron() {
// Cleanup the flood
db_query('DELETE FROM {flood} WHERE timestamp < %d', time() - 3600);
}
; $Id$
name = Watchdog
description = Logs and records system events.
package = Core - required
version = VERSION
......@@ -8,7 +8,7 @@
* An array of modules to be enabled.
*/
function default_profile_modules() {
return array('color', 'comment', 'help', 'taxonomy');
return array('color', 'comment', 'help', 'taxonomy', 'dblog');
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment