浅谈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分页实例代码分享
Jul 28 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
php恢复数组的key为数字序列的方法
Apr 28 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
php数据访问之查询关键字
May 09 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
php的无刷新操作实现方法分析
Feb 28 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
PHP编程与应用
2006/10/09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php 日期时间处理函数小结
2009/12/18 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
php生成无限栏目树
2017/03/16 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
python三引号输出方法
2019/02/27 Python
python实现代码统计程序
2019/09/19 Python
python常用排序算法的实现代码
2019/11/08 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
C#的几个面试问题
2016/05/22 面试题
Java基础面试题
2014/07/19 面试题
临床专业自荐信
2014/06/22 职场文书