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&&mysql)六
Oct 09 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
php数组查找函数总结
Nov 18 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 PHP
PHP7创建销毁session的实例方法
Feb 03 PHP
PHP7变量处理机制修改
Mar 09 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php 特殊字符处理函数
2008/09/05 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
React如何避免重渲染
2018/04/10 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Python 装饰器深入理解
2017/03/16 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python遍历小写英文字母的方法
2019/01/02 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
地道战观后感300字
2015/06/04 职场文书
地雷战观后感
2015/06/09 职场文书
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android