www.baike369.com
百科369 > PHP教程 > PHP使用error_log()函数记录错误日志

PHP使用error_log()函数记录错误日志


PHP使用error_log()函数记录错误日志

PHP提供了错误日志记录的功能,用于在网站运行时随时进行监控,在日后也可以进行分析处理。

error_log()函数专门用于日志记录。语法格式如下:

error_log(message,type[,destination[,extra_headers]]);

第一个参数是出错信息。第二个参数是指定出错信息记录到哪里。如果值为0,就通过PHP标准的错误处理机制来记录出错信息;如果值为1,就将错误通过电子邮件发送到destination地址,并可以选择给邮件消息增加任何额外的头部信息(extra_headers);如果值为3,就将错误追加到destination文件中。

要用PHP的日志记录机制保存出错信息,需要将参数type的值设置为0来调用error_log()函数。通过在php.ini文件中修改error_log的值,可以改变记录到哪个文件中。如果设置error_log为syslog,就替换为使用system logger。例如:

error_log('数据库服务宕机',0);

要通过E-mail来发送错误,需要以type值为1调用error_log()函数。第三个参数是出错信息被发送到的E-mail地址,可选的第四个参数可以用来指定附加的E-mail headers。这就是如果通过邮件发送出错信息,则例子如下:

error_log('数据库服务宕机',1,'info@baike369.com');

最后,为了记录日志到文件中,以type值为3调用error_log()。第三个参数指定了记录日志的文件名称。例如:

error_log('数据库服务宕机',3,'/var/log/php_errors.log');

下面我们实现一个完整的功能,如果发生错误,则记录日志,并且根据错误级别向管理员信箱发送邮件。脚本内容如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>PHP使用error_log()函数记录错误日志实例-www.baike369.com</title>
</head>
<body>
<?php
// 错误处理函数
function error_handler($errno,$errmsg,$file,$line,$vars){
  $time=date("Y-m-d H:i:s"); // 错误发生时间
  // 将错误种类定义为关联数组
  $errortype=array(1=>"Error",2=>"Warning",4=>"Parsing Error",8=>"Notice",
    16=>"Core Error",32=>"Core Warning",64=>"Compile Error",128=>"Compile Warning",
    256=>"User Error",512=>"User Warning",1024=>"User Notice",2048=>"Strict Notice");
$err = <<< ERROR_MESSAGE
  <errorentry>
    <time>$time</time>
    <number>$errno</number>
    <type>$errortype[$errno]</type>
    <errmsg>$errmsg</errmsg>
    <filename>$file</filename>
    <linenum>$line</linenum>
ERROR_MESSAGE;
  // 用户定义的错误 / 通知的情况下记录变量的值
  if($errno &(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)){
    $err .= "\n<vars>".serialize($vars)."</vars>";
  }
  $err .= "\n</errorentry>\n";
  error_log($err,3,"error.log");   // 保存到记录
  if($errno==E_ERROR||$errno==E_USER_ERROR){ // 重大错误以Mail通知
    mail("admin@baike369.com","错误发生通知",$err);
    echo "对不起。因为系统发生问题,停止服务中。";
    die();
  }
}
set_error_handler("error_handler");  // 设定错误处理函数
function divide($num,$den){          // 进行除法的函数
  if($den==0){  // 除数为0的情况下,发生使用者定义的错误
    trigger_error("Cannot divide by zero",E_USER_ERROR);
  }else{
    return($num/$den);
  }
}
$val=SOME_STRING;  // 因为常数未定义,所以发生警告
echo divide(5,0);  // 因为除数为0,所以发生使用者定义的重大错误
?>
</body>
</html>

显示效果如下:

对不起。因为系统发生问题,停止服务中。

将错误记录到了系统日志中。

Copyright© 2011-2016 www.baike369.com All Rights Reserved