搜索
首页php教程php手册php error_log()将错误信息写入日志文件

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

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

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

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

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文件,会发现文字是没有换行的,可以对以上代码做如下改进:

<?php  
$str="这是条错误信息。rn";  
error_log($str,3,&#39;errors.log&#39;);

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

<?php 
function exceptionHandler(){ 
    error_reporting(E_ALL ^ E_NOTICE); 
    date_default_timezone_set(&#39;Etc/GMT-8&#39;);    //设置时区 
    ini_set(&#39;display_errors&#39;,0);    //将错误记录到日志 
    ini_set(&#39;error_log&#39;,&#39;D:&#39;.date(&#39;Y-m-d&#39;).&#39;_weblog.txt&#39;); 
    ini_set(&#39;log_errors&#39;,1);    //开启错误日志记录 
    ini_set(&#39;ignore_repeated_errors&#39;,1);    //不重复记录出现在同一个文件中的同一行代码上的错误信息。 
    $user_defined_err = error_get_last(); 
    if($user_defined_err[&#39;type&#39;] > 0) 
    { 
        switch($user_defined_err[&#39;type&#39;]){ 
            case 1: 
                $user_defined_errType = &#39;致命的运行时错误(E_ERROR)&#39;; 
                break; 
            case 2: 
                $user_defined_errType = &#39;非致命的运行时错误(E_WARNING)&#39;; 
                break; 
            case 4: 
                $user_defined_errType = &#39;编译时语法解析错误(E_PARSE)&#39;; 
                break; 
            case 8: 
                $user_defined_errType = &#39;运行时提示(E_NOTICE)&#39;; 
                break; 
            case 16: 
                $user_defined_errType = &#39;PHP内部错误(E_CORE_ERROR)&#39;; 
                break; 
            case 32: 
                $user_defined_errType = &#39;PHP内部警告(E_CORE_WARNING)&#39;; 
                break; 
            case 64: 
                $user_defined_errType = &#39;Zend脚本引擎内部错误(E_COMPILE_ERROR)&#39;; 
                break; 
            case 128: 
                $user_defined_errType = &#39;Zend脚本引擎内部警告(E_COMPILE_WARNING)&#39;; 
                break; 
            case 256: 
                $user_defined_errType = &#39;用户自定义错误(E_USER_ERROR)&#39;; 
                break; 
            case 512: 
                $user_defined_errType = &#39;用户自定义警告(E_USER_WARNING)&#39;; 
                break; 
            case 1024: 
                $user_defined_errType = &#39;用户自定义提示(E_USER_NOTICE)&#39;; 
                break; 
            case 2048: 
                $user_defined_errType = &#39;代码提示(E_STRICT)&#39;; 
                break; 
            case 4096: 
                $user_defined_errType = &#39;可以捕获的致命错误(E_RECOVERABLE_ERROR)&#39;; 
                break; 
            case 8191: 
                $user_defined_errType = &#39;所有错误警告(E_ALL)&#39;; 
                break; 
            default: 
                $user_defined_errType = &#39;未知类型&#39;; 
                break; 
            } 
        $msg = sprintf(&#39;%s %s %s %s %s&#39;,date("Y-m-d H:i:s"),$user_defined_errType,$user_defined_err[&#39;message&#39;],$user_defined_err[&#39;file&#39;],$user_defined_err[&#39;line&#39;]);//开源代码phprm.com 
        error_log($msg,0); 
    } 
} 
register_shutdown_function(&#39;exceptionHandler&#39;);

调用方法:

 

<?php 
//文件2:【test.php】 
include(&#39;error.class.php&#39;); 
echo $_COOKIE[&#39;aaaaadfa&#39;];    //此cookie不存在就会产生一个错误,用来做测试用 
echo $_SESSION[&#39;aaaaadfa&#39;];    //此session不存在就会产生一个错误,用来做测试用

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

<?php 
/********************************************************** 
* File name: LogsClass.class.php 
* Class name: 日志记录类 
* Create date: 2008/05/14 
* Update date: 2008/09/28 
* Author: blue 
* Description: 日志记录类 
* Example: //设定路径和文件名 
* $dir="a/b/".date("Y/m",time()); 
* $filename=date("d",time()).".log"; 
* $logs=new Logs($dir,$filename); 
* $logs->setLog("test".time()); 
* //使用默认 
* $logs=new Logs(); 
* $logs->setLog("test".time()); 
* //记录信息数组 
* $logs=new Logs(); 
* $arr=array( 
* &#39;type&#39;=>&#39;info&#39;, 
* &#39;info&#39;=>&#39;test&#39;, 
* &#39;time&#39;=>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 ) ? &#39;&#39; : $dir; 
        //默认为以时间+.log的文件文件 
        $this->_filename = emptyempty ( $filename ) ? date ( &#39;Y-m-d&#39;, time () ) . &#39;.log&#39; : $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文件

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


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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具