ACE应用日志是如何实现的?

用过阿里云引擎ACE的同学可能也遇到和天南一样的困惑,我们的应用中代码存在错误,访问应用时就会显示空白页,不会直接输出错误信息。

天南用的是PHP实例,一开始以为是ACE中PHP的error_reporting级别问题,然后天南自己定义了error_reporting(E_ALL)还是没用,后来提交工单阿里官方的回复是让我们去ACE管理控制台–>日志中心–>应用日志 里去查看。瞬间明白阿里的用意了,这样虽然安全,但是调试起来并不方便吧^^^^

不过阿里ACE的日志功能倒引起了天南的兴趣。我们知道,在PHP中可以禁止错误的显示但依旧能记录日志。这对于一般错误都能正常记载,但是,一旦PHP脚本存在语法错误时,还是会直接向页面输出错误(如果开启了PHP错误输出且服务器允许显示具体的错误代码的前提下)。那ACE在日志方面的实现,可能就涉及更改PHP内核了。

<?php

//创建log目录  
define('ERR_LOGS', realpath(__DIR__) . '/guo_errlogs/');
$destination = 'error_' . date('Y-m'); //创建错误日志保存路径  
$err_dir = ERR_LOGS . $destination . '/';
if (!is_dir($err_dir)) {
    mkdir($err_dir);
    chmod($err_dir, 0777);
}

//自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。
function my_error_handler($errno, $errstr, $errfile, $errline) {
    switch ($errno) {
        case E_ERROR:
            echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n";
            echo "程序已经停止运行,请联系管理员。";
            //遇到Error级错误时退出脚本
            exit;
            break;
        case E_WARNING:
            echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n";
            break;
        default:
            //不显示Notice级的错误
            break;
    }
}

ini_set("display_errors", 'Off'); //不在页面显示错误信息  
error_reporting(E_ALL ^ E_NOTICE); //记录错误日志的级别  
ini_set("log_errors", "On"); //打开错误日志  
ini_set("error_log", $err_dir . date('d') . ".log"); //设置保存错误日志的地址 
//set_error_handler("my_error_handler");  //set_error_handler 是用户级错误,对于解析错误它是无法接管的;此函数一般配合trigger_error('00000',E_ERROR) 显式抛出错误
//error_log()也是显式调用,虽然它可以将错误入库处理,但是,遇到语法错误了,它也就不能调用了;
echo; //此处PHP Parse error: syntax error,如果服务器(如IIS)允许显示具体错误代码时就会直接输出错误信息
func();//PHP Warning ,这种普通错误可以通过上面的方法记录到日志中,并且我们可以定制500错误页面,让其显示空白页面(如IIS7.5中,IIS模块-->错误页-->双击500,在此网站上执行URL-->编辑功能设置,选择“自定义错误页”或“详细错误”)。

 

 

发布者:天南

一个好人

留下评论

电子邮件地址不会被公开。 必填项已用*标注