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 = /usr/local/error.log                ;指定产生的 错误报告写入的日志文件位置

PHP 的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记 录在自己指定的错误日志/usr/local/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数据库出现问题的处理为例,该函数的使用如下所示:

 <?php      

  if(!Ora_Logon($username, $password)){     

       error_log("Oracle数据库不可用!", 0);        //将错误消息写入到操作系统日志中
  }   

   if(!($foo=allocate_new_foo()){   

     error_log("出现大麻烦了!", 1, ". mydomain.com");   //发送到管理员邮箱中   

   }  

 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程序发送的定制消息,如下所示:

<?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-10-09 21:31:13

PHP错误日志的相关文章

nginx日志及错误日志详解

nginx错误日志信息介绍 配置记录nginx的错误信息是调试nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在Main区块中全局配置,也可以放置不同的虚拟主机中单独记录虚拟主机的错误信息. error_log的语法格式及参数语法说明如下: error_log    file    level; 关键字        日志文件    错误日志级别 其中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,

mysql错误日志

1.错误日志路径查询 show variables like '%log_error%'; log_error记录了错误日志路径. 2.告警日志设置 show variables like '%log_warnings%'; log_warnings:0表示不记录警告信息,1表示记录警告信息到错误日志,大于1表示"失败的连接"的信息和创建新连接时"拒绝访问"类的错误信息也会被记录到错误日志中.

MS SQL 监控错误日志的告警信息

SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高.但是如果你统计sys.messages,你会发现,实际上只有16(SQL SERVER 2008/2012)或17个(SQL SERVER 2005)个级别.猜测应该是一些留作扩展用,一些留作用户自定义错误消息的级别. sys.messages中有个字段is_event_logged,取值为1时表示出现错误时将消息记入事件日志. 对于 message_id 中的所有消息语

Nginx错误日志整理

Nginx错误日志说明 错误日志类型 类型1: upstream timed out 类型2: connect() failed 类型3: no live upstreams 类型4: upstream prematurely closed connection 类型5: 104: Connection reset by peer 类型6: client intended to send too large body 类型7: upstream sent no valid HTTP/1.0 he

C# 记录错误日志

程序的错误日志如何记录下来? 可以在遇到异常时,Catch异常,然后把异常的信息输出到txt文件中即可 /// <summary> /// 错误日志 /// </summary> public class LogHelper { private static object lockFlag = new object(); private static string LOG_FILE_PATH = AppDomain.CurrentDomain.BaseDirectory + &qu

Hadoop错误日志

1.错误日志:Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible. 错误原因:在Linux下Hadoop等的各种数据默认保存在 /tmp目录下.当重启系统后 /tmp目录中的数据信息被清除,导致Hadoop启动失败.确定目录 /tmp/hadoop-root/dfs/name是否存在解决方案: 使用命令bin/h

记录C#错误日志工具

在编程过程中,我们经常会用try...catch处理可能出错的代码块.如果程序出现错误,则直接show出错误信息. 当然,大型的系统都有错误日志处理模块,用数据库记录错误日志信息,有相应的写入错误日志和读取操作日志的功能,功能强大,实现起来肯定也是相当的复杂. 可有时我们只是想方便的查看错误日志信息,但又不想带来复杂的代码实现.鱼和熊掌都想要?好吧,我来满足你. 1.我们需要把项目的目标框架设置为.Net Framework 4.0: 2.找到项目的代码生成路径,比如我的是bin\Debug\,

MySQL 错误日志(Error Log)

同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志可以帮助我们定义mysqld内部发生的事情,数据库性能故障,记录数据的变更历史,用户恢复数据库等等.本文主要描述错误日志文件. 1.MySQL日志文件系统的组成   a.错误日志:记录启动.运行或停止mysqld时出现的问题.   b.通用日志:记录建立的客户端连接和执行的语句.   c.更新日志:记录更改数据的语句.该日志在M

查看MS SQL SERVER 错误日志

查看目的: 错误日志的查看是确保过程已成功完成(例如,备份和恢复操作,批处理命令,或其他脚本和过程).这可以帮助检测任何当前或潜在的问题,包括自动恢复信息(尤其是如果SQL Server实例已停止并重新启动),内核信息,或其他服务器级别的错误消息. 存放位置: 默认情况下, sql error log的位置(SQL SERVER 2005)在: %PROGRAMFILES%\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG and ERRORLOG.

关闭服务器HTTPERR错误日志

远程登录服务器后,发现服务器的C盘满了,我感觉奇怪,记得我已经把日志移动到D盘了,怎么C盘容量还在不断减少,不断排查,发现 C:\WINDOWS\system32\LogFiles\HTTPERR 目录下有大量log文件,占用了大量空间,C盘满的原因就是这个目录的文件引起的. 默认情况下,Windows 2003服务器会把所有IIS访问错误的记录写入该目录下的 log 文件中,如果访问量比较大,可能一段时间后,日志文件就会占满C盘空间,导致服务器死机. 关闭HTTPERR目录日志文件的方法是:运