PHP错误日志的使用及汇总

对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?

我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者 管理人员查看系统是否存在问题。

如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中 或发送给系统syslog,分别介绍如下:

1、使用指定的文件记录错误报告日志

如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写权限。

假设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写的权限。然后在PHP的配置文件中, 将error_log指令的值设置为这个错误日志文件的绝对路径。

此时需要将php.ini中的配置指令做如下修改:

1. error_reporting  =  E_ALL               ;将会向PHP报告发生的每个错误  

2. display_errors = Off                    ;不显示满足上条 指令所定义规则的所有错误报告  

3. log_errors = On                         ;决定日志语句记录的位置  

4. log_errors_max_len = 1024               ;设置每个日志项的最大长度  

5. error_log = /www/phpernote/error.log    ;指定产生的 错误报告写入的日志文件位置 

PHP的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/www/phpernote/error.log文件中。

此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。该函数的原型如下所示:

1. bool error_log ( string message [, int message_type  [, string destination [, string extra_headers]]] ) 

此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。该函数执行成功则返回TRUE,失败则返回FALSE。

第一个参数 message 是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送消息。

第二个参数 message_type为整数值:0表示送到操作系统的日志中;1则使用PHP的Mail()函数,发送信息到某E-mail处。

第四个参数extra_headers亦会用到;2则将错误信息送到TCP服务器中,此时第三个参数destination表示目的地IP及Port;3则将信息存到文件destination中。

如果以登入Oracle数据库出现问题的处理为例,该函数的使用如下所示:

if(!Ora_Logon($username, $password)){    
    error_log("Oracle数据库不可用!", 0);        //将错误消息写入到操作系统日志中  
}
if(!($foo=allocate_new_foo()){  
    error_log("出现大麻烦了!", 1, ". 111cn.net");   //发送到管理员邮箱中  
}
error_log("搞砸了!",2,"localhost:5000");     //发送到本机对应5000端口的服务器中
error_log("搞砸了!",3,"/usr/local/errors.log");  //发送到指定的文件中

2、 错误信息记录到操作系统的日志里

错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别。在Linux上错误语句将送往syslog,而在Windows上错误将发送到事件日志里。如果你不熟悉syslog,起码要知道它是基于UNIX的日志工具,它提供了一个API来记录与系统和应用程序执行有关的消息。

Windows事件日志实际上与UNIX的syslog相同,这些日志通常可以通过事件查看器来查看。如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog。

具体需要在php.ini中修改的配置指令如下所示:

1. error_reporting  =  E_ALL                   ;将会向PHP报告发生的每个错误  

2. display_errors = Off                        ;不显示 满足上条指令所定义规则的所有错误报告  

3. log_errors = On                             ;决定日志语句记录的位置  

4. log_errors_max_len = 1024                   ;设置每个日志项的最大长度  

5. error_log = syslog                          ;指定产生的错误报告写入操作系统的日志里 

除了一般的错误输出之外,PHP还允许向系统syslog中发送定制的消息。虽然通过前面介绍的error_log()函数,也可以向syslog中发送定制的消息,但在PHP中为这个特性提供了需要一起使用的4个专用函数。

分别介绍如下:

define_syslog_variables()

在使用openlog()、syslog及closelog()三个函数之前必须先调用该函数。因为在调用该函数时,它会根据现在的系统环境为下面三个函数初使用化一些必需的常量。

openlog()

打开一个和当前系统中日志器的连接,为向系统插入日志消息做好准备。并将提供的第一个字符串参数插入到每个日志消息中,该函数还需要指定两个将在日志上下文使用的参数,可以参考官方文档使用。

 syslog()

该函数向系统日志中发送一个定制消息。需要两个必选参数,第一个参数通过指定一个常量定制消息的优先级。例如LOG_WARNING表示一般的警告,LOG_EMERG表示严重地可以预示着系统崩溃的问题,一些其他的表示严重程度的常量可以参考官方文档使用。第二个参数则是向系统日志中发送的定制 消息,需要提供一个消息字符串,也可以是PHP引擎在运行时提供的错误字符串。

closelog()

该函数在向系统日志中发送完成定制消息以后调用,关闭由openlog()函数打开的日志连接。

如果在配置文件中,已经开启向syslog发送定制消息的指令,就可以使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的syslog解析工具,查看和分析由PHP程序发送的定制消息,如下所示:

define_syslog_variables(); 

openlog("PHP5", LOG_PID , LOG_USER); 

syslog(LOG_WARNING, "警告报告向syslog中发送的演示, 警告时间:".date("Y/m/d H:i:s"));

closelog();

以Windows系统为例,通过右击"我的电脑"选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了。上面这段代码将在系统的syslog文件中,生成类似下面的一条信息,是事件的一部分:

1. PHP5[3084], 警告报告向syslog中发送的演示, 警告时间:2009/03/26 04:09:11. 

使用指定的文件还是使用syslog记录错误日志,取决于你所在的Web服务器环境。如果你可以控制Web服务器,使用syslog是最理想的,因为你能利用syslog的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。

时间: 2024-09-20 11:48:50

PHP错误日志的使用及汇总的相关文章

CodeIgniter记录错误日志的方法全面总结_php实例

本文实例讲述了CodeIgniter记录错误日志的方法.分享给大家供大家参考,具体如下: CI工作流程: 所有的入口都从根目录下的index.php进入,确定应用所在目录后,加载 codeigniter/CodeIgniter.php 文件,该文件会顺序加载以下文件执行整个流程. index.php:检测文件路径,加载codeigniter.php文件 codeigniter.php: 加载 Common/constants....文件.获取文件模式.设置计时器.实例化类(错误类.扩展类.钩子类

php错误日志简单配置方法_php技巧

本文实例讲述了php配置错误日志的方法.分享给大家供大家参考,具体如下: php.ini: ; 错误日志 log_errors = On ; 显示错误 display_errors = Off ; 日志路径 error_log = "/usr/local/lnmp/php/var/log/error_log" ; 错误等级 error_reporting = E_ALL&~E_NOTICE php-fpm.conf: [global] ; php-fpm pid文件 pid =

点击Button按钮时出现闪退,各位大神如何解决。附带错误日志。

问题描述 点击Button按钮时出现闪退,各位大神如何解决.附带错误日志. 解决方案 WifiAdmin第289行有null对象呗释放了啊 解决方案二: WifiAdmin.java 289行 对象为空,检查一下,可能没有初始化: 解决方案三: 解决方案四: WifiAdmin.java 289行 对象为空,检查一下,可能没有初始化: 解决方案五: 在 289行前加一行 if(existingConfigs!=null) 试试: 解决方案六: WifiAdmin第289行有null

安卓开发中不能建立wifi热点,可以连接热点,附带错误日志,希望大神指教。

问题描述 安卓开发中不能建立wifi热点,可以连接热点,附带错误日志,希望大神指教.

让你的错误能留下痕迹....(错误日志mysql篇目)

mysql|错误 class.method     //建立错误日志    function error(){        $fp=@fopen("error.dat","a+");        $time=date("Y-m-d H:i:s");        $msg="{VisitedTime:$time}\t{VisiterIP:$_SERVER[REMOTE_ADDR]}\t{Errormsg:".mysql_e

SQL Server错误日志过滤(ERRORLOG)

一.背景 有一天我发现SQL Server服务器的错误日志中包括非常多关于sa用户的登陆错误信息:"Login failed for user 'sa'. 原因: 评估密码时出错.[客户端: XX.XX.XX.XX]".可是我很久之前就已经禁用了sa用户,怎么还会有那么多的sa用户登陆信息呢?我猜想是有人在暴力破解我们数据库的sa用户的密码:关于这种攻击,大家有没好的解决方案呢? 我查找了一些资料,暂时没有找到好的解决方案.我只想到一个暂时缓解压力的办法,那就是从错误信息中统计出登陆s

SQL Server 错误日志收缩(ERRORLOG)

一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文件中.默认保留有7个 SQL Server 错误日志文件,分别是:ErrorLog,Errorlog.1-Errorlog.6 ,当前的错误日志(文件ErrorLog)没有扩展名.每当启动 SQL Server 实例时,将创建新的错误日志ErrorLog,并将之前的ErrorLog更名为ErrorL

log4j perl 错误日志提取

日志 #!/bin/perl use Encode ; open(NOTESFILES,$ARGV[0]); my %errorMeganotes; print ">>>>>>>>>>>>>>",$ ARGV[0],"<<<<<<<<<<\n"; while (<NOTESFILES>) { if( $_=~/^

PHP中把错误日志保存在系统日志中

  这篇文章主要介绍了PHP中把错误日志保存在系统日志中(Windows系统),本文讲解了设置方法和查看方法,需要的朋友可以参考下 [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: 复制代码 代码如下: error_log = syslog 或者在运行时使用 ini_set() 函数设置. [例1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php //关闭错误显示 ini_set('display_errors