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 相关文章推荐
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
PHP中PDO的事务处理分析
Apr 07 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 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
Terran建筑一览
2020/03/14 星际争霸
PHP的可变变量名的使用方法分享
2012/02/05 PHP
phpmail类发送邮件函数代码
2012/02/20 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
C#的几个面试问题
2016/05/22 面试题
吸烟检讨书2000字
2014/02/13 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
初中学生操行评语
2014/12/26 职场文书
项目经理岗位职责
2015/01/31 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
Java中的随机数Random
2022/03/17 Java/Android
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers