PHP错误日志详解

zxh5566  2016-08-14 13:27   Hits: 

对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接,数据库表等信息而遭到黑客攻击,但是任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?我们可以在单独的文本文件中将错误报告作为日志记录,错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可,错误报告默认就会记录到web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中,当然也可以记录错误日志到指定的文件中或发送给系统syslog

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

如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能,并且该文件一定要让PHP脚步的执行用户具有写权限,假设在Linux操作系统中,将/usr/local目录下的error.log文件作为错误日志文件,并设置web服务器进程用户具有写的权限,然后在PHP的配置文件中,将error.log指令的值设置为这个错误日志文件的绝对路径,需要对php.ini的配置指令做如下修改

error_reporting = E_ALL
display_errors = Off
log_errors = On
log_errors_max_len = 1024
error_log = /usr/local/error.log

PHP的配置文件按上面的方式设置完成以后,并重启服务器,这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/usr/local/error.log中,此外,不仅可以记录满足error_reporting所定义的错误,还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。该函数会送出错误信息到web服务器的错误日志,或某个指定文件中,该函数执行成功则返回TRUE,失败则返回FALSE,第一个参数message是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送信息,第二个参数message_type为整数值,0表示送到操作系统日志,1则使用PHP的mail()函数,发送信息到某个e-mail处,第四个参数extra_headers会用到,2则将错误信息发送到tcp服务器中,此时第三个参数destination表示目的ip及port,3则将错误信息存到文件destination中,如果以登入oracle数据库出现问题的处理为例,该函数使用如下:

<?php
if(!Ora_Logon($username,$password)){
error_log("Oracle 数据库不可用!",0); //将错误信息写入到操作系统日志中
}

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

错误报告也可以记录到操作系统的日志里,但不同的操作系统之间的日志管理有点区别,在Linux上错误语句将送到syslog,而在windows上错误将发送到事件日志里,如果你不熟悉syslog,起码要知道它是基于UNIx的日志工具,它提供了一个API来记录与系统和应用程序执行有关的信息。windows事件日志实际上与unix的syslog相同,这些日志通常可以通过事件查看器来查看,如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog,具体需要在php.ini中修改的配置指令如下

error_reporting=E_ALL
display_errors=On
log_error=On
log_errors_max_len=1024
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()打开的日志连接
如果在配置文件中,已经开启向suyslog发送定制消息的指令,就可以使用前面介绍的四个函数发一个警告信息到系统日志中,并通过系统中的syslog解析工具,查看和分析由PHP程序发送的定制消息
<?php
define_syslog_variables();
openlog('PHP5',LOG_PID,LOG_USER);
syslog(LOG_WARNING,"警告报告向syslog中发送的演示,警告时间:".date("Y/m/d H:i:s"));
?>
以windows系统为例,通过右击我的电脑选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了,上面代码将在系统的syslog文件中,生成类似下面的一条信息,是事件的一部分。
使用指定的文件还是使用syslog记录错误日志,取决于你所在的web服务器环境,如果你可以控制web服务器,使用syslog是最理想的,因为你能利用syslog的解析工具来查看和分析日志,但如果你的网站在共享服务器的虚拟主机,就只能使用单独的文本文件记录错误日志了。

上一篇:PHP错误和异常处理
下一篇:PHP异常处理