记录PHP通知错误

7

我最近接手了一个遗留系统的开发工作,想要在部署环境中开启 PHP E_NOTICE 的日志记录。部署环境 ini 文件中有以下指令...

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

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

那么我该如何开始记录 PHP E_NOTICE 呢?


请查看此链接: http://il2.php.net/manual/zh/function.set-error-handler.php - Michael
除非我漏掉了什么,否则应该已经记录了通知。你是否检查过它是否使用了一些自定义的错误处理程序? - Álvaro González
@Álvaro G. Vicario - 我也是这么想的。没有自定义错误处理程序,当我打开错误显示(display_errors = On)时,会显示通知,但不会记录! - chattsm
为了开始缩小问题范围,您可以忘记实际的代码库并尝试这个简单的片段 - Álvaro González
@Álvaro G. Vicario - 这段代码片段根本没有记录任何东西,也没有创建名为“foo.log”的文件。 - chattsm
3个回答

3

更新:

根据评论中@m.p.c的说法,当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中引入。当我刚刚测试在PHP 5.2上设置E_DEPRECATED时,PHP响应错误,并将error_reporting级别设置为0,这意味着它不报告任何错误。虽然对于一个早期的php.ini文件来说使用这个设置毫无意义,但我认为至少需要提高您正在使用不支持它的服务器上的E_DEPRECATED的可能性。如果您不确定自己的版本,可以运行phpinfo(),它将显示包含大量信息的页面,包括您安装的版本号。

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

重要提示: 当您使用set_error_handler()时,将完全绕过PHP的默认错误处理程序。这意味着您的error_handler级别将变得没有意义。所有错误,无论其严重性如何,都将传递到您创建的错误处理函数。 PHP传递给此函数的第一个参数将是错误编号,即找到的错误的E_xxx常量的数值。您需要编写自定义代码来仅捕获想要的错误。
例如,要捕获E_NOTICE错误,您的函数应如下所示:
function my_error_handler($errno, $errstr, $errfile, $errline) {
  if ($errno == E_NOTICE) {
    // handle/log the error
  } 
}

set_error_handler("my_error_handler");

一个详尽且构思良好的回答。然而,打开display_errors确实会显示通知,只是没有记录,而且服务器正在运行PHP 5.3.5,所以E_DEPRECATED问题不适用。我想避免编写自己的错误处理程序,我只是无法弄清楚为什么通知会显示,但不会记录! - chattsm
@m.p.c 我没有意识到这些错误会在浏览器中显示。看起来你的 error_reporting 级别没问题,而是日志文件本身出了问题。我已经在我的答案顶部进行了更新。 - AgentConundrum

2
原来系统有一个自定义的Apache ErrorLog指令,而我一直在tail -f ...默认的Apache error_log文件。
提醒自己:在在stackoverflow上发布愚蠢问题之前,始终首先检查Web服务器设置!

1

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

<?php


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

set_error_handler("myErrorHandler");

我想避免添加自定义错误处理程序,因为这并不能解决在打开display_errors = On时显示通知但仍未记录的问题。 - chattsm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接