浅谈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 相关文章推荐
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
PHP生成不重复随机数的方法汇总
Nov 19 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
PHP共享内存用法实例分析
Feb 12 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
js实现随机8位验证码
2020/07/24 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
PHP如何自定义函数
2016/09/16 面试题
平面设计专业求职信
2014/08/09 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
小平小道观后感
2015/06/09 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
党员心得体会范文2016
2016/01/23 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python