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开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
PHP实现微信发红包程序
Aug 24 PHP
解读PHP中上传文件的处理问题
May 29 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 PHP
PHP addslashes()函数讲解
Feb 03 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
浅谈PHP7中的一些小技巧
May 29 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如何编写易读的代码
2007/07/10 PHP
php小偷相关截取函数备忘
2010/11/28 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
js option删除代码集合
2008/11/12 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
python实现的防DDoS脚本
2011/02/08 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
对python模块中多个类的用法详解
2019/01/10 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
python实现人工蜂群算法
2020/09/18 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
商务专员岗位职责
2013/11/23 职场文书
翻译专业应届生求职信
2013/11/23 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
2019同学聚会主持词
2019/05/06 职场文书
各国货币符号大全
2022/02/17 杂记
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL