目前的tp框架虽然有了错误日志,但不支持监控报警,以下是我的报警机制
找到文件
thinkphp\library\think\exception.class.php
将class exception extends \exception {
}修改为class exception extends \exception {
public function __destruct(){
$xdebug_message = $this->message;
$xdebug_code = $this->code;
$xdebug_file = $this->file;
$xdebug_line = $this->line;
$xdebug_html = $this->__tostring();
$sms_content = $xdebug_message . ' in ' . $xdebug_file . ' on line ' . $xdebug_line . ' at ' . __self__;
$email_content = nl2br($xdebug_html);
$path = realpath(log_path).'/error_report/';
if(!is_dir($path)) mkdir($path);
if(!is_dir($path.'sms')) mkdir($path.'sms');
if(!is_dir($path.'email')) mkdir($path.'email');
$datetime = date('y-m-d_h-i-s').'_'.rand(1000,9999).'.log';
$sms_file = $path.'sms/'.$datetime;
$email_file = $path.'email/'.$datetime;
file_put_contents($sms_file,$sms_content);
file_put_contents($email_file,$email_content);
}
}找到文件
thinkphp\library\think\think.class.php 第286行
将 if (app_debug || is_cli) {
//调试模式下输出错误信息
if (!is_array($error)) {
$trace = debug_backtrace();
$e['message'] = $error;
$e['file'] = $trace[0]['file'];
$e['line'] = $trace[0]['line'];
ob_start();
debug_print_backtrace();
$e['trace'] = ob_get_clean();
} else {
$e = $error;
}
if(is_cli){
exit(iconv('utf-8','gbk',$e['message']).php_eol.'file: '.$e['file'].'('.$e['line'].')'.php_eol.$e['trace']);
}
} else {
//否则定向到错误页面
$error_page = c('error_page');
if (!empty($error_page)) {
redirect($error_page);
} else {
$message = is_array($error) ? $error['message'] : $error;
$e['message'] = c('show_error_msg')? $message : c('error_message');
}
}修改为 //获取错误信息
if (!is_array($error)) {
$trace = debug_backtrace();
$e['message'] = $error;
$e['file'] = $trace[0]['file'];
$e['line'] = $trace[0]['line'];
ob_start();
debug_print_backtrace();
$e['trace'] = ob_get_clean();
} else {
$e = $error;
}
// 监测机制
$xdebug_type = '';
if(preg_match('/^'.l('_module_not_exist_').'/',$e['message'])){
$xdebug_type = 'module_not_exist';
}elseif(preg_match('/^'.l('_controller_not_exist_').'/',$e['message'])){
$xdebug_type = 'controller_not_exist';
}elseif(preg_match('/^'.l('_error_action_').'/',$e['message'])){
$xdebug_type = 'error_action';
}
$allow = c('error_listen_level');
if(empty($xdebug_type) || in_array($xdebug_type,explode(',',$allow))){
$content = $e['message'] . ' in ' . $e['file'] . ' on line ' . $e['line'] . ' at ' . __self__;
$econtent = $content.(isset($e['trace'])?'
'.$e['trace']:'');
// 写入监测日志
$path = realpath(log_path).'/error_report/';
if(!is_dir($path)) mkdir($path);
if(!is_dir($path.'sms')) mkdir($path.'sms');
if(!is_dir($path.'email')) mkdir($path.'email');
$datetime = date('y-m-d_h-i-s').'_'.rand(1000,9999).'.log';
$sms_file = $path.'sms/'.$datetime;
$email_file = $path.'email/'.$datetime;
c('error_listen_sms') && file_put_contents($sms_file,$content);
c('error_listen_email') && file_put_contents($email_file,$econtent);
}
if (app_debug || is_cli) {
if(is_cli){
exit(iconv('utf-8','gbk',$e['message']).php_eol.'file: '.$e['file'].'('.$e['line'].')'.php_eol.$e['trace']);
}
} else {
//否则定向到错误页面
$error_page = c('error_page');
if (!empty($error_page)) {
redirect($error_page);
} else {
$message = is_array($error) ? $error['message'] : $error;
$e['message'] = c('show_error_msg')? $message : c('error_message');
}
}这样,当有错误的时候,就会在设定好的目录里生成相应的报警文件,我们只要监控这两个目录,并将相关信息发送到监控人邮箱或手机即可
ad:真正免费,域名+虚机+企业邮箱=0元