0

0

php error_log()将错误信息写入日志文件

php中文网

php中文网

发布时间:2016-05-24 12:59:18

|

2634人浏览过

|

来源于php中文网

原创

使用dedecms的朋友可能会自己dedecms会记录程序执行错误文件和注入sql到一个日志文件中去,下面我来介绍在php中的一个error_log()将错误信息写入日志文件实例,希望此方法对大家有帮助.

error_log() 是发送错误信息到某个地方的一个函数,在程序编程中比较常见,尤其是在程序调试阶段.

本文将用实例讲解一下error_log()这个函数的用法,以及一些需要注意的问题,代码如下:

$str='这是条错误信息。';  

立即学习PHP免费学习笔记(深入)”;

error_log($str,3,'errors.log');  

上述是最常用的error_log()例子,它的作用是把一条信息写入errors.log这个文件里,这个文件如果不存在则自动创建,在这个例子中,我们看到有一个参数“3”,注意这个数字“3”不能更改也不能去掉.

下面列举一下使用error_log()这个函数的过程中可能出现的问题:

(1)程序报错提示:Warning: error_log() [function.error-log]: failed to open stream: Permission denied in ...on line ...

上述错误的出现,是因为文件没有写权限,开启该目录的文件写权限即可.

(3)写入到log文件中的信息不能换行

使用error_log()写入log文件,会发现文字是没有换行的,可以对以上代码做如下改进:

AlegroCart
AlegroCart

AlegroCart新功能:维类:包括在这两种线性长宽高或面积或体积长波产品尺寸允许与期权产品:让产品/期权组合独特的数量,尺寸,图像和型号。选择店铺标识管理 图片放大镜:显示一个图片放大上空盘旋时,产品形象弹出框。自定义错误报告:设置在管理员启用。 开发者只可以显示详细的信息。错误信息都写入到错误日志文件每天可以通过电子邮件发送给管理员。仓库皮卡航运模块:允许客户指定产品在商店的位置回升。增加了

下载

注意$str,用的是双引号,php单引号和双引号的区别,还在字符串结尾加上了rn,这跟第一个实例那个写法是不同的,下面我再分享两个自定义记录出错日志实例,代码如下:

 0) 
    { 
        switch($user_defined_err['type']){ 
            case 1: 
                $user_defined_errType = '致命的运行时错误(E_ERROR)'; 
                break; 
            case 2: 
                $user_defined_errType = '非致命的运行时错误(E_WARNING)'; 
                break; 
            case 4: 
                $user_defined_errType = '编译时语法解析错误(E_PARSE)'; 
                break; 
            case 8: 
                $user_defined_errType = '运行时提示(E_NOTICE)'; 
                break; 
            case 16: 
                $user_defined_errType = 'PHP内部错误(E_CORE_ERROR)'; 
                break; 
            case 32: 
                $user_defined_errType = 'PHP内部警告(E_CORE_WARNING)'; 
                break; 
            case 64: 
                $user_defined_errType = 'Zend脚本引擎内部错误(E_COMPILE_ERROR)'; 
                break; 
            case 128: 
                $user_defined_errType = 'Zend脚本引擎内部警告(E_COMPILE_WARNING)'; 
                break; 
            case 256: 
                $user_defined_errType = '用户自定义错误(E_USER_ERROR)'; 
                break; 
            case 512: 
                $user_defined_errType = '用户自定义警告(E_USER_WARNING)'; 
                break; 
            case 1024: 
                $user_defined_errType = '用户自定义提示(E_USER_NOTICE)'; 
                break; 
            case 2048: 
                $user_defined_errType = '代码提示(E_STRICT)'; 
                break; 
            case 4096: 
                $user_defined_errType = '可以捕获的致命错误(E_RECOVERABLE_ERROR)'; 
                break; 
            case 8191: 
                $user_defined_errType = '所有错误警告(E_ALL)'; 
                break; 
            default: 
                $user_defined_errType = '未知类型'; 
                break; 
            } 
        $msg = sprintf('%s %s %s %s %s',date("Y-m-d H:i:s"),$user_defined_errType,$user_defined_err['message'],$user_defined_err['file'],$user_defined_err['line']);//开源代码phprm.com 
        error_log($msg,0); 
    } 
} 
register_shutdown_function('exceptionHandler');

调用方法:

 

例2,日志记录类,代码如下:

setLog("test".time()); 
* //使用默认 
* $logs=new Logs(); 
* $logs->setLog("test".time()); 
* //记录信息数组 
* $logs=new Logs(); 
* $arr=array( 
* 'type'=>'info', 
* 'info'=>'test', 
* 'time'=>date("Y-m-d H:i:s",time()) 
* ); 
* $logs->setLog($arr); 
**********************************************************/ 
class Logs { 
    private $_filepath; //文件路径 
    private $_filename; //日志文件名 
    private $_filehandle; //文件句柄 
    /** 
     *作用:初始化记录类 
     *输入:文件的路径,要写入的文件名 
     *输出:无 
     */ 
    public function Logs($dir = null, $filename = null) { 
        //默认路径为当前路径 
        $this->_filepath = emptyempty ( $dir ) ? '' : $dir; 
        //默认为以时间+.log的文件文件 
        $this->_filename = emptyempty ( $filename ) ? date ( 'Y-m-d', time () ) . '.log' : $filename; 
        //生成路径字串 
        $path = $this->_createPath ( $this->_filepath, $this->_filename ); 
        //判断是否存在该文件 
        if (! $this->_isExist ( $path )) { //不存在 
            //没有路径的话,默认为当前目录 
            if (! emptyempty ( $this->_filepath )) { 
                //创建目录 
                if (! $this->_createDir ( $this->_filepath )) { //创建目录不成功的处理 
                    die ( "创建目录失败!" ); 
                } 
            } 
            //创建文件 
            if (! $this->_createLogFile ( $path )) { //创建文件不成功的处理 
                die ( "创建文件失败!" ); 
            } 
        } 
        //生成路径字串 
        $path = $this->_createPath ( $this->_filepath, $this->_filename ); 
        //打开文件 
        $this->_filehandle = fopen ( $path, "a+" ); 
    } 
    /** 
     *作用:写入记录 
     *输入:要写入的记录 
     *输出:无 
     */ 
    public function setLog($log) { 
        //传入的数组记录 
        $str = ""; 
        if (is_array ( $log )) { 
            foreach ( $log as $k => $v ) { 
                $str .= $k . " : " . $v . "n"; 
            } 
        } else { 
            $str = $log . "n"; 
        } 
        //写日志 
        if (! fwrite ( $this->_filehandle, $str )) { //写日志失败 
            die ( "写入日志失败" ); 
        } 
    } 
    /** 
     *作用:判断文件是否存在 
     *输入:文件的路径,要写入的文件名 
     *输出:true | false 
     */ 
    private function _isExist($path) { 
        return file_exists ( $path ); 
    } 
    /** 
     *作用:创建目录(引用别人超强的代码-_-;;) 
     *输入:要创建的目录 
     *输出:true | false 
     */ 
    private function _createDir($dir) { 
        return is_dir ( $dir ) or ($this->_createDir ( dirname ( $dir ) ) and mkdir ( $dir, 0777 )); 
    } 
    /** 
     *作用:创建日志文件 
     *输入:要创建的目录 
     *输出:true | false 
     */ 
    private function _createLogFile($path) { 
        $handle = fopen ( $path, "w" ); //创建文件 
        fclose ( $handle ); 
        return $this->_isExist ( $path ); 
    } 
    /** 
     *作用:构建路径 
     *输入:文件的路径,要写入的文件名 
     *输出:构建好的路径字串 
     */ 
    private function _createPath($dir, $filename) { 
        if (emptyempty ( $dir )) { 
            return $filename; 
        } else { 
            return $dir . "/" . $filename; 
        } 
    } 
    /** 
     *功能: 析构函数,释放文件句柄 
     *输入: 无 
     *输出: 无 
     */ 
    function __destruct() { 
        //关闭文件 
        fclose ( $this->_filehandle ); 
    } 
}

修正:

1,不用每写一条日志就进行次文件的IO的操作,在对象声明时打开文件句柄

2,支持数组类型的日志记录

3,可使用默认路径和默认文件,为当前目录下的YYYY-MM-DD.log文件

总结:个人更喜欢系统自带的函数,如果系统自带的日志记录函数满足不了我们就可以使用下面自定义函数.


PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

PHP入门到实战消息队列RabbitMQ
PHP入门到实战消息队列RabbitMQ

共22课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号