浅谈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 相关文章推荐
2.PHP入门
Oct 09 PHP
PHP安装攻略:常见问题解答(三)
Oct 09 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
header跳转和include包含问题详解
Sep 08 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
php命令行使用方法和命令行参数说明
Apr 08 PHP
PHP的pcntl多进程用法实例
Mar 19 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 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
apache配置虚拟主机的方法详解
2013/06/17 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
python通过函数属性实现全局变量的方法
2015/05/16 Python
python实现中文分词FMM算法实例
2015/07/10 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
网络书店创业计划书
2014/02/07 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
班组建设经验交流材料
2014/05/12 职场文书
银行求职信怎么写
2014/05/26 职场文书
技术负责人任命书
2014/06/05 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL