在PHP中如何获取到nginx中的logid,以及自定义PHP错误日志

前言:
我们日常在调试错误信息时,想要知道这个错误是来自那个请求的,这种时候如果没有明显的关系,就只能靠时间来推测,是很不准确的,如果我们能够在php-error.log中记录下nginx的logid,就能够很快的定位出问题的来源,也就能够快速找到该条nginx请求。
PHP中无法直接获取到Nginx的logid,但是可以使用相同的算法从而得到和Nginx中相同的logid,算法如下:

$arr = gettimeofday();
$logid = ((($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF) | 0x80000000);

这样就能得到Nginx中的logid。

在PHP中编写如下函数:

public function addLogIdToErrorLog($error_no, $error_str, error_file, error_line) {
    $log_file = "/usr/local/php/php-error.log";//你的php-error.log所在的位置,最好使用绝对路径
    $display_str = "";

    switch($error_no) {
        case E_ERROR:
        $display_str = 'nginx_logid:' . $logid . '这是致命错误' . $error_str . PHP_EOL;
        break;

        case E_WARNING:
        $display_str = 'nginx_logid:' . $logid . '这是警告' . $error_str . PHP_EOL;
        break;
        ...
        /*
         * 如果不想修改默认错误,只想要修改用户级别的错误,只需要case出用户错误,再进行修改
         */
    }
}

然后在PHP中你需要修改记录error_log的地方调用以下代码

$error_handler = set_error_handler("myErrorHandler");//开启自定义错误日志

最后来一张PHP error_level配置表:

数字 常量 说明
1 E_ERROR 致命错误,脚本执行中断,就是脚本中有不可识别的东西出现 举例: Error:Invalid parameters. Invalid parameter name
2 E_WARNING 部分代码出错,但不影响整体运行 举例: Warning: require_once(E:/include/config_base.php)
4 E_PARSE 字符、变量或结束的地方写规范有误举例: Parse error: syntax error, unexpected $end in
8 E_NOTICE 一般通知,如变量未定义等举例: Notice: Undefined variable: p in E:\web\index.php on line 17
16 E_CORE_ERROR PHP进程在启动时,发生了致命性错误 举例: 暂无
32 E_CORE_WARNING 在PHP启动时警告(非致命性错误)举例: 暂无
64 E_COMPILE_ERROR 编译时致命性错误举例: 暂无
128 E_COMPILE_WARNING 编译时警告级错误举例: 暂无
256 E_USER_ERROR 用户自定义的错误消息举例: 暂无
512 E_USER_WARNING 用户自定义的警告消息举例: 暂无
1024 E_USER_NOTICE 用户自定义的提醒消息举例: 暂无
2047 E_ALL 以上所有的报错信息,但不包括E_STRICT的报错信息举例: 暂无
2048 E_STRICT 编码标准化警告,允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性。

参考资料
浅谈php自定义错误日志

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章