浅谈php自定义错误日志


Posted in PHP onFebruary 13, 2015

平时经常看php的错误日志,很少有机会去自己动手写日志,看了王健的《最佳日志实践》觉得写一个清晰明了,结构分明的日志还是非常有必要的。

在写日志前,我们问问自己:为什么我们有时要记录自定义的日志呢?而不用系统默认的日志记录方式呢?

我认为有两个原因:

1.团队需要一个统一格式的日志方便管理

2.大量无用错误日志占据硬盘空间,仅需记录有意义的日志。

 那么,实践一下。

1.打开你的php.ini

 2.打开日志记录,将

log_errors = Off

改成

log_errors = On

3.将php.ini保存退出并重启web服务器

4.在你的代码最前面加上如下代码

<?php

//错误处理函数

function myErrorHandler($errno, $errstr, $errfile, $errline)

{

    $log_file = "./php_%s_log_".date("Ymd").".log";//定义日志文件存放目录和文件名

    $template = '';

    switch ($errno) {

    case E_USER_ERROR:

        $template .= "用户ERROR级错误,必须修复 错误编号[$errno] $errstr ";

        $template .= "错误位置 文件$errfile,第 $errline 行\n";

        $log_file = sprintf($log_file,'error');

        exit(1);//系统退出

        break;

    case E_USER_WARNING:

        $template .= "用户WARNING级错误,建议修复 错误编号[$errno] $errstr ";

        $template .= "错误位置 文件$errfile,第 $errline 行\n";

        $log_file = sprintf($log_file,'warning');

        break;

    case E_USER_NOTICE:

        $template .= "用户NOTICE级错误,不影响系统,可不修复 错误编号[$errno] $errstr ";

        $template .= "错误位置 文件$errfile,第 $errline 行\n";

    $log_file = sprintf($log_file,'notice');

        break;

    default:

        $template .= "未知错误类型: 错误编号[$errno] $errstr  ";

        $template .= "错误位置 文件$errfile,第 $errline 行\n";

        $log_file = sprintf($log_file,'unknown');

        break;

    }

    file_put_contents($log_file,$template,FILE_APPEND);

    return true;

}

$error_handler = set_error_handler("myErrorHandler");//开启自定义错误日志

5.试着在刚才的代码后写下一段错误代码

echo 1/0;

看看你定义的路径下是否多了一个日志文件呢?:)

注:以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

 不过当你开启了错误日志系统(php.ini中的log_error = on)并且指定了系统日志文件(同样也是php.ini中的error_log=路径名),并且error_reporting开启了全部后,以上的错误都会作为系统错误日志而记录在你定义的文件中。

以上就是本文所述的全部内容了,希望大家能对php自定义错误日志有新的认识。

PHP 相关文章推荐
PHP下MAIL的另一解决方案
Oct 09 PHP
PHP 中执行排序与 MySQL 中排序
Apr 21 PHP
工厂模式在Zend Framework中应用介绍
Jul 10 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
浅析php创建者模式
Nov 25 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
Smarty环境配置与使用入门教程
May 11 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
Jul 27 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 #PHP
php制作动态随机验证码
Feb 12 #PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 #PHP
php模拟post提交数据的方法
Feb 12 #PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 #PHP
PHP进程同步代码实例
Feb 12 #PHP
PHP CURL 内存泄露问题解决方法
Feb 12 #PHP
You might like
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
DJI全球:DJI Global
2021/03/15 全球购物
实习教师自我鉴定
2013/12/12 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
无私奉献演讲稿
2014/09/04 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
总经理聘用协议书
2015/09/21 职场文书
外出学习心得体会范文
2016/01/18 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
Python 图片添加美颜效果
2022/04/28 Python