我最近接管了遗留系统的开发,并希望能够在部署环境中打开PHP E_NOTICE
的日志记录。部署环境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
级别1}}通知显示,但未记录。
那么如何开始记录PHP E_NOTICE
?
答案 0 :(得分: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
,这意味着它报告完全没有错误。虽然5.3之前的php.ini
文件使用此设置没有任何意义,但我觉得至少提高在不支持它的服务器上使用E_DEPRECATED
的可能性很重要。如果您不确定自己的版本,可以运行phpinfo()
,它会显示一个包含大量信息的页面,包括您安装的版本号。
尽管如此,如果我误解了你的问题并且你只是在谈论创建自己的自定义日志记录,那么你需要创建一个在发生错误时运行的函数,并使用{将其指定为错误处理程序{1}}功能。
重要的是要注意,当您使用set_error_handler()
时,您完全绕过PHP的默认错误处理程序。这意味着您的set_error_handler()
级别变得毫无意义。所有错误,无论其严重程度如何,都将传递给您创建的错误处理函数。 PHP传递给此函数的第一个参数是错误编号,它是找到的错误的error_handler
常量的数值。您需要编写自定义代码以仅捕获所需的错误。
例如,要捕获仅 E_xxx
错误,您的函数将如下所示:
E_NOTICE
答案 1 :(得分:2)
结果是系统定义了一个自定义的Apache ErrorLog
指令,并且我已经tail -f ...
默认的Apache error_log。
自我注意:在SO上发布愚蠢的问题之前,请先检查Web服务器设置!
答案 2 :(得分:0)
您可以创建自己的处理程序
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if ($errno == E_USER_NOTICE){
/* log actions here */
}
}
set_error_handler("myErrorHandler");