6

我最近接管了遗留系统的开发,并希望能够E_NOTICE在部署环境中打开 PHP 的日志记录。部署环境 ini 具有以下指令...

error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
log_errors = On

error_reporting使用 , 比较了位掩码echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting();,两者都匹配,所以我知道error_reporting系统本身的级别没有改变,如果我打开display_errors = On通知,则会显示,但不会记录。

那么如何开始记录 PHPE_NOTICE呢?

4

3 回答 3

3

更新:

根据对此答案的评论中的@mpc,打开时会在浏览器中显示错误display_errors,但不会出现在日志中。我假设根本没有出现错误。

错误是E_NOTICE唯一没有出现在日志中的错误,还是所有错误类型都受到影响?如果都是错误类型,那么我首先要检查的是是否启用了错误日志记录。尝试ini_set('log_errors', 'On');在脚本顶部设置。如果这不起作用,请尝试将您的日志文件设置为您确定服务器可以通过调用ini_set('error_log', 'your_file_path');. 如果这些都不起作用,那么我认为您的 PHP 安装存在严重问题。php.ini如果这些修复中的任何一个有效,如果您有访问权限,您可以将它们放入您的实际中。


原答案:

根据error_reporting您问题的级别,您的 PHP 安装应该已经设置为报告E_NOTICE错误。如果它没有记录这些错误,则说明有问题。我建议打开display_errors以查看是否显示任何E_NOTICE错误。如果您无法更改php.ini文件,请尝试ini_set('display_errors', 'On');在脚本顶部运行。显然,这些错误只有在您触发一个错误时才会显示和/或被记录,因此您应该仔细检查您是否确实在某个地方这样做。

一个警告是E_DEPRECATED错误级别仅在 PHP 5.3 中引入。当我刚刚E_DEPRECATED在 PHP 5.2 安装上测试设置时,PHP 以错误响应,并将error_reporting级别设置为0,这意味着它根本不报告任何错误。虽然 5.3 之前的php.ini文件使用此设置没有意义,但我认为至少提高您在E_DEPRECATED不支持它的服务器上使用的可能性很重要。如果您不确定您的版本,您可以运行phpinfo(),它会显示一个包含大量信息的页面,包括您安装的版本号。

尽管如此,如果我误解了您的问题并且您只是在谈论创建自己的自定义日志记录,那么您需要创建一个函数以在发生错误时运行并将其分配为使用该set_error_handler()函数的错误处理程序。

需要注意的是,当您使用 时set_error_handler(),您会完全绕过 PHP 的默认错误处理程序。这意味着你的error_handler等级变得毫无意义。所有错误,无论其严重程度如何,都将传递给您创建的错误处理函数。E_xxxPHP 传递给这个函数的第一个参数是错误号,它是找到的错误常量的数值。您需要编写自定义代码来仅捕获您想要的错误。

例如,要 E_NOTICE捕获错误,您的函数应如下所示:

function my_error_handler($errno, $errstr, $errfile, $errline) {
  if ($errno == E_NOTICE) {
    // handle/log the error
  } 
}

set_error_handler("my_error_handler");
于 2011-08-22T16:11:28.747 回答
2

原来系统定义了一个自定义的 ApacheErrorLog指令,而我一直tail -f ...是默认的 Apache error_log。

自我注意:在发布关于 SO 的愚蠢问题之前,请务必先检查 Web 服务器设置!

于 2011-08-23T09:35:40.007 回答
0

您可以创建自己的处理程序

<?php


function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ($errno == E_USER_NOTICE){
        /*  log actions here */
    }
}

set_error_handler("myErrorHandler");
于 2011-08-22T15:47:40.233 回答