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

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

May 24, 2016 pm 12:59 PM
error_log PHP 오류 메시지

使用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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)