繁体   English   中英

记录PHP通知错误

[英]Logging PHP notice errors

我最近接管了遗留系统的开发,并希望能够在部署环境中打开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位掩码echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting(); echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting(); ,两者都匹配,所以我知道error_reporting级别在系统内部没有改变,如果我转动display_errors = On则会显示通知,但不会记录。

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

更新:

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

E_NOTICE错误是唯一未出现在日志中的错误,还是所有错误类型都受到影响? 如果它是所有错误类型,那么我要检查的第一件事是甚至是否启用了错误记录。 尝试设置ini_set('log_errors', 'On'); 在脚本的顶部。 如果这不起作用,那么尝试通过调用ini_set('error_log', 'your_file_path');将日志文件设置为您确定服务器可以写入的内容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 ,这意味着它根本没有报告任何错误 虽然5.3之前的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");

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

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

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

<?php


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

set_error_handler("myErrorHandler");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM