php 把语法错误写入日志,PHP error_log()将错误信息写入日志文件

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

bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )

把错误信息发送到 web 服务器的错误日志,或者到一个文件里。

message应该被记录的错误信息。信息长度限制:The default seem to be 1024 but can be changed by adjusting the value of the runtime configurationvalue of ‘log_errors_max_len‘message_type设置错误应该发送到何处。可能的信息类型有以下几个:

error_log() 日志类型

0

message 发送到 PHP 的系统日志,使用 操作系统的日志机制或者一个文件,取决于 error_log 指令设置了什么。 这是个默认的选项。

1

message 发送到参数 destination 设置的邮件地址。 第四个参数 extra_headers 只有在这个类型里才会被用到。

2

不再是一个选项。

3

message 被发送到位置为 destination 的文件里。 字符 message 不会默认被当做新的一行。

4

message 直接发送到 SAPI 的日志处理程序中。destination目标。它的含义描述于以上,由 message_type 参数所决定。extra_headers额外的头。当 message_type 设置为 1 的时候使用。 该信息类型使用了 mail() 的同一个内置函数。

代码:

if (!Ora_Logon($username, $password)) {error_log("Oracle database not available!", 0);

}//如果用尽了 FOO,通过邮件通知管理员

if (!($foo =allocate_new_foo())) {error_log("Big trouble, we‘re all out of FOOs!", 1,

"[email protected]");

}//调用 error_log() 的另一种方式:

error_log("You messed up!", 3, "/var/tmp/my-errors.log");?>

代码2:

上述是最常用的error_log()例子,它的作用是把一条信息写入errors.log这个文件里,这个文件如果不存在则自动创建。

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

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

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

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

使用error_log()写入log文件,会发现文字是没有换行的,可以在信息后边加上\n:

两个自定义记录出错日志实例:

functionexceptionHandler(){error_reporting(E_ALL ^ E_NOTICE);

date_default_timezone_set(‘Etc/GMT-8‘); //设置时区

ini_set(‘display_errors‘,0); //将错误记录到日志

ini_set(‘error_log‘,‘D:\‘.date(‘Y-m-d‘).‘_weblog.txt‘);

ini_set(‘log_errors‘,1); //开启错误日志记录

ini_set(‘ignore_repeated_errors‘,1); //不重复记录出现在同一个文件中的同一行代码上的错误信息。

$user_defined_err = error_get_last();

if($user_defined_err[‘type‘] > 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‘]);

error_log($msg,0);

}

}

register_shutdown_function(‘exceptionHandler‘);

?>

调用方法

//文件2:【test.php】

include(‘error.class.php‘);

echo $_COOKIE[‘aaaaadfa‘]; //此cookie不存在就会产生一个错误,用来做测试用

echo $_SESSION[‘aaaaadfa‘]; //此session不存在就会产生一个错误,用来做测试用

?>

* 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(

* ‘type‘=>‘info‘,

* ‘info‘=>‘test‘,

* ‘time‘=>date("Y-m-d H:i:s",time())

* );

* $logs->setLog($arr);

**********************************************************/

classLogs {private $_filepath; //文件路径

private $_filename; //日志文件名

private $_filehandle; //文件句柄

/**

*作用:初始化记录类

*输入:文件的路径,要写入的文件名

*输出:无*/

public function Logs($dir = null, $filename = null) {//默认路径为当前路径

$this->_filepath = empty ( $dir ) ? ‘‘ : $dir;//默认为以时间+.log的文件文件

$this->_filename = empty ( $filename ) ? date ( ‘Y-m-d‘, time () ) . ‘.log‘ : $filename;//生成路径字串

$path = $this->_createPath ( $this->_filepath, $this->_filename );//判断是否存在该文件

if (! $this->_isExist ( $path )) { //不存在

//没有路径的话,默认为当前目录

if (! empty ( $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 (empty ( $dir)) {return $filename;

}else{return $dir . "/" . $filename;

}

}/**

*功能: 析构函数,释放文件句柄

*输入: 无

*输出: 无*/

function__destruct() {//关闭文件

fclose ( $this->_filehandle );

}

}?>

PS:

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

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

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

原文:http://www.cnblogs.com/CheeseZH/p/4857939.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值