浅谈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里的JS打印函数
Oct 09 PHP
用PHP和MySQL保存和输出图片
Oct 09 PHP
php的大小写敏感问题整理
Dec 29 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php调整服务器时间的方法
Apr 03 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
TP5框架实现签到功能的方法分析
Apr 05 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
Javascript Math对象
2009/08/13 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
python求众数问题实例
2014/09/26 Python
Python字符串替换实例分析
2015/05/11 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
一看就懂得Python的math模块
2018/10/21 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
高一自我鉴定
2013/12/17 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
小学思品教学反思
2016/02/20 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python