Modify query_error() to log errors to a database table instead of displaying them on the screen. This should

let us more easily debug difficult or intermittent issues that users may not report. Add a cron to report logged
errors to appdb admins every night.  Implement some basic unit tests for the new error logging code
This commit is contained in:
Chris Morgan
2006-07-19 16:37:54 +00:00
committed by WineHQ
parent 2976ff9833
commit a651a3cdf3
8 changed files with 166 additions and 7 deletions

View File

@@ -78,7 +78,8 @@ orphanSessionMessagesCheck();
/* check and purge any expired sessions from the session_list table */ /* check and purge any expired sessions from the session_list table */
orphanSessionListCheck(); orphanSessionListCheck();
/* report error log entries to admins and flush the error log after doing so */
reportErrorLogEntries();
/* Users that are unwarned and inactive since $iMonths */ /* Users that are unwarned and inactive since $iMonths */
@@ -228,3 +229,11 @@ function orphanSessionListCheck()
$sQuery = "DELETE from session_list where TO_DAYS(NOW()) - TO_DAYS(stamp) > ?"; $sQuery = "DELETE from session_list where TO_DAYS(NOW()) - TO_DAYS(stamp) > ?";
$hResult = query_parameters($sQuery, SESSION_DAYS_TO_EXPIRE + 2); $hResult = query_parameters($sQuery, SESSION_DAYS_TO_EXPIRE + 2);
} }
function reportErrorLogEntries()
{
error_log::mail_admins_error_log();
error_log::flush();
}
?>

92
include/error_log.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
define(ERROR_SQL, "sql_error");
define(ERROR_GENERAL, "general_error");
class error_log
{
function log_error($sErrorType, $sLogText)
{
global $aClean;
/* dump the contents of $_REQUEST and $aClean to a variable */
/* so we can output that to the log entry. it should make it much easier */
/* to determine when and where the error took place */
ob_start();
echo "REQUEST:\n";
var_dump($_REQUEST);
echo "aClean:\n";
var_dump($aClean);
$sRequestText = ob_get_contents();
ob_end_clean();
$sQuery = 'INSERT INTO error_log (submitTime, userid, type, log_text, request_text, deleted) '.
"VALUES(?, '?', '?', '?', '?', '?')";
$hResult = query_parameters($sQuery,
"NOW()",
$_SESSION['current']->iUserId,
$sErrorType,
$sLogText,
$sRequestText,
'0');
}
function getEntryCount()
{
$sQuery = "SELECT count(*) as cnt FROM error_log WHERE deleted = '0'";
$hResult = query_parameters($sQuery);
$oRow = mysql_fetch_object($hResult);
return $oRow->cnt;
}
/* purge all of the current entries from the error log */
function flush()
{
$sQuery = "UPDATE error_log SET deleted='1'";
$hResult = query_parameters($sQuery);
if($hResult) return true;
else return false;
}
function mail_admins_error_log()
{
$sSubject = "Appdb error log\r\n";
$sEmail = User::get_notify_email_address_list(null, null); /* get list admins */
$sQuery = "SELECT * from error_log WHERE deleted='0' ORDER BY submitTime";
$hResult = query_parameters($sQuery);
$bEmpty = false;
if(mysql_num_rows($hResult) == 0)
$bEmpty = true;
$sMsg = "Log entries:\r\n";
$sMsg.= "\r\n";
$sMsg.= "Submit time userid type\r\n";
$sMsg.= "log_text\r\n";
$sMsg.= "request_text\r\n";
$sMsg.="----------------------------------\r\n\r\n";
/* append each log entry to $sMsg */
while($oRow = mysql_fetch_object($hResult))
{
$sMsg.=$oRow->submitTime." ".$oRow->userid." ".$oRow->type."\r\n";
$sMsg.= "---------------------\r\n";
$sMsg.=$oRow->log_text."\r\n";
$sMsg.= "---------------------\r\n";
$sMsg.=$oRow->request_text."\r\n\r\n";
}
/* if we had no entries we should indicate */
/* that the error log is empty */
if($bEmpty)
$sMsg = "The error log is empty.\r\n";
if($sEmail)
mail_appdb($sEmail, $sSubject, $sMsg);
}
}
?>

View File

@@ -11,6 +11,7 @@ require(BASE."include/user.php");
require(BASE."include/session.php"); require(BASE."include/session.php");
require(BASE."include/menu.php"); require(BASE."include/menu.php");
require(BASE."include/html.php"); require(BASE."include/html.php");
require(BASE."include/error_log.php");
require(BASE."include/query.php"); require(BASE."include/query.php");
/* if magic quotes are enabled make sure the user disables them */ /* if magic quotes are enabled make sure the user disables them */

View File

@@ -113,11 +113,10 @@ function query_bugzilladb($sQuery,$sComment="")
function query_error($sQuery, $sComment="") function query_error($sQuery, $sComment="")
{ {
$sStatusMessage = "<p><b>Database Error!</b><br />"; $sStatusMessage = "<p><b>An internal error has occurred and has been logged and reported to appdb admins</b></p>";
$sStatusMessage .= "Query: ".$sQuery."<br />"; addmsg($sStatusMessage);
$sStatusMessage .= $sComment ? $sComment."<br />" : "";
$sStatusMessage .= mysql_error()."</p>\n"; error_log::log_error(ERROR_SQL, "Query: '".$sQuery."' mysql_error(): '".mysql_error()."' comment: '".$sComment."'");
addmsg($sStatusMessage, "red");
} }
?> ?>

View File

@@ -30,3 +30,5 @@ mysql -p -u root < buglinks.sql
echo Adding monitors echo Adding monitors
mysql -p -u root < monitors.sql mysql -p -u root < monitors.sql
echo Creating error logging tables
mysql -p -u root < error_log.sql

14
tables/error_log.sql Normal file
View File

@@ -0,0 +1,14 @@
use apidb;
drop table if exists error_log;
create table error_log (
id int not null auto_increment,
submitTime datetime,
userid int not null default '0',
type enum('sql_error', 'general_error'),
log_text text,
request_text text,
deleted bool,
key(id)
);

View File

@@ -12,5 +12,7 @@ echo "\n";
include_once("test_query.php"); include_once("test_query.php");
echo "\n"; echo "\n";
include_once("test_image.php"); include_once("test_image.php");
echo "\n";
include_once("test_error_log.php");
?> ?>

View File

@@ -0,0 +1,40 @@
<?php
require_once("path.php");
require_once(BASE."include/incl.php");
function test_error_log_log_error()
{
error_log::log_error(ERROR_SQL, "This is a sql error");
error_log::log_error(ERROR_GENERAL, "This is a general error");
/* make sure the error log count matches what we expect */
$iExpected = 2;
$iActual = error_log::getEntryCount();
if($iActual != $iExpected)
{
echo "Expected error_log::getEntryCount() of ".$iExpected." got ".$iActual;
return false;
}
error_log::flush(); /* flush the error log */
/* make sure the error log count matches what we expect */
$iExpected = 0;
$iActual = error_log::getEntryCount();
if($iActual != $iExpected)
{
echo "Expected error_log::getEntryCount() of ".$iExpected." got ".$iActual;
return false;
}
return true;
}
if(!test_error_log_log_error())
echo "test_error_log_log_error() failed!\n";
else
echo "test_error_log_log_error() passed\n";
?>