实现目的:生成错误日志并记录txt文件以便于查询遇到bug,以下方法不影响原来php错误机制
只记录日志,方法中必须返回false,不然影响原来错误输出,也可以自己写输出错误
1、set_error_handler() 函数设置用户自定义的错误处理函数。
该函数用于创建运行期间的用户自己的错误处理方法。
该函数返回旧的错误处理程序,如果失败则返回 NULL
注意函数捕捉不了部分错误函数,比如未定义函数test()
2、使用register_shutdown_function函数捕获致命错误,函数运行条件如下
1、当页面被用户强制停止时
2、当程序代码运行超时时
3、当PHP代码执行完成时,代码执行存在异常和错误、警告
错误报告级别
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 运行时非致命的错误。没有停止执行脚本。 |
8 | E_NOTICE | 运行时的通知。脚本发现可能是一个错误,但也可能在正常运行脚本时发生。 |
256 | E_USER_ERROR | 用户生成的致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_ERROR。 |
512 | E_USER_WARNING | 用户生成的非致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。这就如同一个可以由用户定义的句柄捕获的 E_ERROR(见 set_error_handler())。 |
8191 | E_ALL | 所有的错误和警告的级别,除了 E_STRICT(自 PHP 6.0 起,E_STRICT 将作为 E_ALL的一部分)。 |
<?php
set_error_handler("myErrorHandler");//运行时错误
register_shutdown_function('fatalError');//致命错误
test();
function myErrorHandler($errno, $errstr, $errfile, $errline){
$err_code="";
switch ($errno) {
case E_ERROR:
$err_code="E_ERROR";
break;
case E_PARSE:
$err_code="E_PARSE";
break;
case E_CORE_ERROR:
$err_code="E_CORE_ERROR";
break;
case E_COMPILE_ERROR:
$err_code="E_COMPILE_ERROR";
break;
case E_USER_ERROR:
$err_code="E_USER_ERROR";
break;
default:
$err_code="NOTIC_ERROR";
break;
}
$data= $_POST;
$errorStr="";
$errorStr .= "\nrequest_type:".$_SERVER['REQUEST_METHOD'];
$errorStr .= "\nrequest_url:".$_SERVER['REQUEST_URI'];
$errorStr .="\nrequest_data:".(is_array($data)?json_encode($data):$data);
$errorStr .=$last= "\n{$err_code}:".$errstr .$errfile." 第 $errline 行.";
w_log($errorStr,'/err/');
// echo $last;
return false;
}
function fatalError() {
$err_code="";
if ($e = error_get_last()) {
switch($e['type']){
case E_ERROR:
$err_code="E_ERROR";
case E_PARSE:
$err_code="E_PARSE";
case E_CORE_ERROR:
$err_code="E_CORE_ERROR";
case E_COMPILE_ERROR:
$err_code="E_COMPILE_ERROR";
case E_USER_ERROR:
$err_code="E_USER_ERROR";
halt($e,$err_code);
break;
}
}
return false;
}
function halt($error,$err_code) {
$e = array();
if (!is_array($error)) {
$trace = debug_backtrace();
$e['message'] = $error;
$e['file'] = $trace[0]['file'];
$e['line'] = $trace[0]['line'];
debug_print_backtrace();
$e['trace'] = ob_get_clean();
} else {
$e = $error;
}
$data= $_POST;
$errorStr="";
$errorStr .= "\nrequest_type:".$_SERVER['REQUEST_METHOD'];
$errorStr .= "\nrequest_url:".$_SERVER['REQUEST_URI'];
$errorStr .="\nrequest_data:".(is_array($data)?json_encode($data):$data);
$errorStr .=$last= "\n{$err_code}:--".$e['message'] .$e['file']." 第 {$e['line']} 行".PHP_EOL.$e['trace'];
w_log($errorStr,'/err/');
}
function w_log($data,$path = 'debug/')
{
$dir = __DIR__ . '/' . $path;
if (!is_dir($dir)) {
mkdir($dir, 777);
}
$log_file = $dir . date('Ymd', time()) . '.txt';
file_put_contents($log_file, "\r\n", FILE_APPEND);
file_put_contents($log_file, "/" . date("Y-m-d H:i:s") . "--" . $data, FILE_APPEND);
}
最后运行结果
本文含有隐藏内容,请 开通VIP 后查看