php 自定义错误日志实例详解


Posted in PHP onNovember 12, 2016

php 自定义错误日志

 项目中需要对定义错误日志及时处理, 那么就需要修改自定义错误日志的输出方式(写日志、发邮件、发短信)

  一. register_shutdown_function(array('phperror','shutdown_function')); //定义PHP程序执行完成后执行的函数

函数可实现当程序执行完成后执行的函数,其功能为可实现程序执行完成的后续操作。程序在运行的时候可能存在执行超时,或强制关闭等情况,但这种情况下默认的提示是非常不友好的,如果使用register_shutdown_function()函数捕获异常,就能提供更加友

好的错误展示方式,同时可以实现一些功能的后续操作,如执行完成后的临时数据清理,包括临时文件等。

 可以这样理解调用条件:

1、当页面被用户强制停止时

2、当程序代码运行超时时

3、当PHP代码执行完成时,代码执行存在异常和错误、警告

  二. set_error_handler(array('phperror','error_handler')); // 设置一个用户定义的错误处理函数

通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

 三. set_exception_handler(array('phperror','appException')); //自定义异常处理

定义异常抛出的数据格式。

class phperror{
  
  //自定义错误输出方法
  public static function error_handler($errno, $errstr, $errfile, $errline){
    $errtype = self::parse_errortype($errno);
    $ip = $_SERVER['REMOTE_ADDR'];//这里简单的获取客户端IP
    //错误提示格式自定义
    $msg = date('Y-m-d H:i:s')." [$ip] [$errno] [-] [$errtype] [application] {$errstr} in {$errfile}:{$errline}";
    //自定义日志文件的路径
    $logPath = 'logs/app.log';
    //写操作,注意文件大小等控制
    file_put_contents($logPath, $msg, FILE_APPEND);
  }

  //系统运行中的错误输出方法
  public static function shutdown_function(){
    $lasterror = error_get_last();//shutdown只能抓到最后的错误,trace无法获取
    $errtype = self::parse_errortype($lasterror['type']);
    $ip = $_SERVER['REMOTE_ADDR'];//这里简单的获取客户端IP
    //错误提示格式自定义
    $msg = date('Y-m-d H:i:s')." [$ip] [{$lasterror['type']}] [-] [$errtype] [application] {$lasterror['message']} in {$file}:{$lasterror['line']}";
    //自定义日志文件的路径
    $logPath = 'logs/app.log';
    //写操作,注意文件大小等控制
    file_put_contents($logPath, $msg,FILE_APPEND);
  }

 //自定义异常输出

  public static function appException($exception) { 
 echo " exception: " , $exception->getMessage(), "/n"; 
  } 
  private static function parse_errortype($type){
    switch($type){
      case E_ERROR: // 1 
        return 'Fatal Error';
      case E_WARNING: // 2 
        return 'Warning';
      case E_PARSE: // 4 
        return 'Parse error';
      case E_NOTICE: // 8 
        return 'Notice';
      case E_CORE_ERROR: // 16 
        return 'Core error';
      case E_CORE_WARNING: // 32 
        return 'Core warning';
      case E_COMPILE_ERROR: // 64 
        return 'Compile error';
      case E_COMPILE_WARNING: // 128 
        return 'Compile warning';
      case E_USER_ERROR: // 256 
        return 'User error';
      case E_USER_WARNING: // 512 
        return 'User warning';
      case E_USER_NOTICE: // 1024 
        return 'User notice';
      case E_STRICT: // 2048 //
        return 'Strict Notice';
      case E_RECOVERABLE_ERROR: // 4096 
        return 'Recoverable Error';
      case E_DEPRECATED: // 8192 
        return 'Deprecated';
      case E_USER_DEPRECATED: // 16384 
        return 'User deprecated';
    }
    return $type;
  }
  
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
php cookis创建实现代码
Mar 16 PHP
php 数组的指针操作实现代码
Feb 08 PHP
精美漂亮的php分页类代码
Apr 02 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
php删除指定目录的方法
Apr 03 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
PHP引用返回用法示例
May 28 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
php中如何执行linux命令详解
Nov 06 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 #PHP
php array_values 返回数组的所有值详解及实例
Nov 12 #PHP
php array_udiff_assoc 计算两个数组的差集实例
Nov 12 #PHP
PHP上传图片、删除图片简单实例
Nov 12 #PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 #PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 #PHP
thinkPHP多语言切换设置方法详解
Nov 11 #PHP
You might like
中国第一家无线电行
2021/03/01 无线电
用PHP书写安全的脚本代码
2012/02/05 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
PHP7 list() 函数修改
2021/03/09 PHP
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
python3排序的实例方法
2020/10/20 Python
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
求职教师自荐书
2014/06/19 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python