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 相关文章推荐
提问的智慧
Oct 09 PHP
以文本方式上传二进制文件的PHP程序
Oct 09 PHP
使用php重新实现PHP脚本引擎内置函数
Mar 06 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
解析php中static,const与define的使用区别
Jun 18 PHP
php之curl设置超时实例
Nov 03 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 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
PHP 图片文件上传实现代码
2010/12/29 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
浅谈js闭包理解
2019/04/01 Javascript
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python读取Excel实例详解
2018/08/17 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python增加图像对比度的方法
2019/07/12 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
企划主管岗位职责
2013/12/12 职场文书
单位办理社保介绍信
2014/01/10 职场文书
社区工作者先进事迹
2014/01/18 职场文书
火车的故事教学反思
2014/02/11 职场文书
亲属关系公证书
2014/04/08 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
校园安全主题班会
2015/08/12 职场文书
党章学习心得体会2016
2016/01/14 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle