热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

使用dedecms的朋友可能会自己dedecms会记录程序执行错误文件和注入sql到一个日志文件中去,下面我来介绍在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文件,会发现文字是没有换行的,可以对以上代码做如下改进:

注意$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文件

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

推荐阅读
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文详细介绍了Mybatis中#与$的区别及其作用。#{}可以防止sql注入,拼装sql时会自动添加单引号,适用于单个简单类型的形参。${}则将拿到的值直接拼装进sql,可能会产生sql注入问题,需要手动添加单引号,适用于动态传入表名或字段名。#{}可以实现preparedStatement向占位符中设置值,自动进行类型转换,有效防止sql注入,提高系统安全性。 ... [详细]
author-avatar
在烟的世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有