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() 的同一个内置函数。

代码:

<?php
// 如果无法连接到数据库,发送通知到服务器日志
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,
"operator@example.com");
} // 调用 error_log() 的另一种方式:
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

代码2:

<?php
$str='这是条错误信息。';
error_log($str,3,'errors.log');
?>

上述是最常用的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:

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

<?php
//文件1:【error.class.php】
function exceptionHandler(){
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');
?> 调用方法 <meta charset="utf-8">
<?php
//文件2:【test.php】
include('error.class.php');
echo $_COOKIE['aaaaadfa']; //此cookie不存在就会产生一个错误,用来做测试用
echo $_SESSION['aaaaadfa']; //此session不存在就会产生一个错误,用来做测试用
?>
<?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(
* '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 = 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文件

ZH奶酪:PHP error_log()将错误信息写入日志文件的更多相关文章

  1. winform程序捕获全局异常,对错误信息写入日志并弹窗

    使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...

  2. java将错误信息写入文件

    第一种办法可以通过字符串,也就是先把错误信息写入字符串,再将字符串写入文件 import java.io.*; public class Demo { public static void main( ...

  3. 将不同级别的logging 日志信息写入不同文件

    将不同级别的logging 日志信息写入不同文件 # -*- coding: utf-8 -*- import os import time from logging.handlers import ...

  4. 【.net 深呼吸】写入日志文件

    记录日志,一方面可以把日志写入系统的日志存储中,可在“事件查看器”窗口中查看:如果不喜欢写到系统的日志文件中,也可以写到自己定义的文件中. 其实,日志文件就是文本文件,可能有朋友会想到用写入文本文件的 ...

  5. log4Net(写入日志文件)

    这里就简单介绍下log4Net对写入日志文件的一些了解,写入数据库类似,就不在一一介绍了. 首先去log4net下载. 然后我们新建一个控制台应用程序,并引入log4net.dll程序集,log4ne ...

  6. Linux bash 中,如何将正常信息和错误信息输出到文件

    问题描述: $ command 2>> error $ command 1>> output 是否有方法,在bash同一行,实现输出stderr到error文件,输出stdou ...

  7. MVC 部署出现错误未能写入输出文件xxxxxxx.

    编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\ro ...

  8. impdp报错: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误

    windows平台下,oracle 11.2.0.1在使用impdp向测试环境导入数据的时候,报出如下错误: 错误原因: 数据泵在写日志文件的时候,使用的是数据库字符集.如果客户端的环境变量NLS_L ...

  9. Log4j不写入日志文件排错记录

    背景: 之前用 log4j一直设置的输出到控制台.今天由于job任务出现了异常,因为是异步的,没办法在控制台看错误信息了,于是乎决定把日志打印到文件里面.然后就找了篇博客配置了下.但是配置完后,怎么也 ...

随机推荐

  1. Unity3D实践系列03,使用Visual Studio编写脚本与调试

    在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...

  2. SpringBoot打jar包问题

    原文:https://jingyan.baidu.com/article/6f2f55a11d6e09b5b93e6c9e.html 当你使用springBoot进行打包的时候,这篇经验会帮助到你的. ...

  3. file is universal (4 slices) but does not contain a(n) armv7s slice

    关于ld: file is universal (2 slices) but does not contain a(n) armv7s slice 升级了xcode之后,支持iOS6和iPhone5, ...

  4. C#判断字符串的是否是汉字

    //第一种方法:正则表达式 private bool IsChinese(string Text) { ; i < Text.Length; i++) { if (Regex.IsMatch(T ...

  5. 动态规划经典问题Java实现

    动态规划问题Java实现 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? public class DPProblem { public static void main( ...

  6. Java利用QRCode.jar包实现二维码编码与解码

    QRcode是日本人94年开发出来的.首先去QRCode的官网http://swetake.com/qrcode/java/qr_java.html,把要用的jar包下下来,导入到项目里去.qrcod ...

  7. SVG.js 图案使用和use引用

    一.SVG.Pattern 图案设置 var draw = SVG('svg1').size(300, 300); //SVG.Pattern 图案设置 var pattern = draw.patt ...

  8. Android日志监听工具logcat命令详解(转)

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来查看和使用. 在使用logcat之前,请确保手机的USB调试 ...

  9. 启明星请假系统appform:流程在线帮助

    启明星默认员工角色都是空的,对于空的角色,系统使用staff角色. 也就是,默认员工都是staff. 因此,你只要定义主管和经理角色即可. 例如:  staff-manage-hr operator

  10. 标准输出中stderr和stdout的区别

    一.首先介绍一下三者printf,sprintf,fprintf的功能 1,printf就是标准输出,在屏幕上打印出一段字符串来. 2,sprintf就是把格式化的数据写入到某个字符串中.返回值字符串 ...