• 如何写错误日志


    对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_error选项关闭,以免因为这些错误所透漏的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。

      如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中发送给syslog,分别介绍如下:
      ①使用指定的文件记录错误报告日志
      如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写入权限。架设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写入的权限。然后在PHP的配置文件中,将error_log指令设置为这个错误日志文件的绝对路径。需要对php.ini中的配置指令做如下修改:
      error_reporting = E_ALL ;将会向PHP报告发生的每个错误
      display_errors=Off ;不显示满足上条指令所定义规则的所有错误报告
      log_errors=on ;决定日志语句记录的位置
      log_errors_max_len ;设置每个日志项的最大长度
      error_log=/use/local/error.log ;指定产生的错误报告写入的日志文件文职
      PHP的配置文件按上面的方式设置完成以后,重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/usr/local/error.log中。此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log(),将函数的原型如下所示:
      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中。如果以登入Oreacle数据库出现问题的处理为例,该函数的使用如下所示:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    if(!Ora_Logon($username,$password)){ //打开一个 Oracle 连接
    //将错误消息写入到操作系统日志中
    error_log("Oracle数据库不可用!",0);
    }
     
    //发送到本机对应5000端口的服务器中
    error_log("搞砸了!",2,"localhost:5000");
    //发送到指定文件夹中
    error_log("搞砸了",3,"/usr/local/errors.log");
    ?>
      ②错误信息记录到操作系统的日志里
      错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别在Linux中错误语句将送往syslog,而在Windows中错误将发送到事件日志里。如果你不熟悉syslog,起码要知道它是基于UNIX的日志工具,它提供了一个API来记录与系统和应用程序执行有关的消息。Windows事件日志实际上与UNIX的syslog相同,这些日志通常可以通过事件查看器来查看。如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog。具体需要在php.ini中修改的配置指令如下所示:
      error_reporting = E_ALL ;将会向PHP报告发生的每个错误
      display_errors=Off ;不显示满足上条指令所定义规则的所有错误报告
      log_errors=on ;决定日志语句记录的位置
      log_errors_max_len ;设置每个日志项的最大长度
      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程序发送的定制消息,如下所示:
    1
    2
    3
    4
    5
    6
    <?php
    define_syslog_variables();
    openlog("php5",LOG_PID,LOG_USER);
    syslog(LOG_WARNING,"警告报告向syslog中发送的演示,警告时间:".date("Y/m/d H:i:s"));
    closelog();
    ?>
      以Windows系统为例,通过右击“我的电脑”选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了。上面这段代码将在系统syslog文件中,生成类似下面的一条信息,是事件的一部分:
      PHP5[3084],警告报告向syslog中发送弄个的演示,警告时间:2012/03/26 04:09:11.
      使用指定的文件还是使用syslog记录错误日志,取决于你所在的Web服务器环境。如果你可以控制Web服务器,使用syslog是最理想的,因为你能利用syslog的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只能使用单独的文本文件记录错误日志了。
     
  • 相关阅读:
    《《《Postman 的官网下转
    《《《Springboot 配置 application.yml 连接MySQL数据库
    《《《MyBatis-Plus完成可用项目(通过测试可以连接数据库并返回数据(可以当作开发模板使用))
    《《《spring boot配置文件application.yml出现的异常信息:(java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml')
    《《《转载 Intellij IDEA 导入Maven项目
    start.spring.io访问不了,导致springboot项目创建不起来(Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings. Error mes...)
    《《《MyBatis-Plus入门 视频学习笔记
    在pom.xml中查看引入关系图
    《《《如何建立局域网共享文件夹(怎样通过IP地址共享文件夹(同一个局域网下))
    JS跨域问题及其解决办法
  • 原文地址:https://www.cnblogs.com/ncong/p/3914750.html
Copyright © 2020-2023  润新知