我想在某个cronjob期间抑制codeigniter错误日志中的通知。我已尝试在该行前使用@,但它仍会在日志中打印通知:
这是生成通知的行:
@$resultarray[1][2]++;
通知: ...严重性:通知 - >未定义的偏移量:1 ...
我在这里做错了什么?
(我很好地使用它,所以请不要声称不使用@的消息,谢谢:))
答案 0 :(得分:6)
要让PHP报告除E_Notice之外的所有错误,请调用PHP error_reporting函数,如下所示:
error_reporting(E_ALL & ~E_NOTICE);
我认为最好的方法是在应用程序的根目录配置index.php,首先检测应用程序环境,然后有条件地设置报告的PHP错误。
的index.php
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'development':
case 'testing':
case 'staging':
error_reporting(E_ALL & ~E_NOTICE);
break;
case 'production':
error_reporting(0);
break;
default:
exit('The application environment is not set correctly.');
}
}
有关更多配置选项,请参阅有关error_reporting函数的官方PHP Documentation。
或者,您可以在您正在使用的特定文件(无论您的cron作业调用)中调用error_reporting函数,并使用您在index.php中设置的内容覆盖配置。这是一个使用控制器的简单示例:
class Sample_Controller extends CI_Controller {
public function __construct()
{
parent::__construct();
error_reporting(E_ALL & ~E_NOTICE);
}
}
答案 1 :(得分:3)
在system / core / Common.php中
function _exception_handler($severity, $message, $filepath, $line)
{
// We don't bother with "strict" notices since they tend to fill up
// the log file with excess information that isn't normally very helpful.
// For example, if you are running PHP 5 and you use version 4 style
// class functions (without prefixes like "public", "private", etc.)
// you'll get notices telling you that these have been deprecated.
if ($severity == E_STRICT || !error_reporting()) // <-- add || !error_reporting()
{
return;
}
$_error =& load_class('Exceptions', 'core');
// Should we display the error? We'll get the current error_reporting
// level and add its bits with the severity bits to find out.
if (($severity & error_reporting()) == $severity)
{
$_error->show_php_error($severity, $message, $filepath, $line);
}
// Should we log the error? No? We're done...
if (config_item('log_threshold') == 0)
{
return;
}
$_error->log_exception($severity, $message, $filepath, $line);
}
}
添加|| !error_reporting()
,CodeIgniter不会记录带有错误控制操作符@
的表达式。
答案 2 :(得分:0)
直接从docs
<?php
// Turn off all error reporting
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Report all PHP errors (see changelog)
error_reporting(E_ALL);
// Report all PHP errors
error_reporting(-1);
// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
在你的php.ini评论中,
error_reporting = E_ALL & ~E_NOTICE
error_reporting = E_ALL & ~E_NOTICE | E_STRICT
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ER… _ERROR
error_reporting = E_ALL & ~E_NOTICE
答案 3 :(得分:0)
来自http://php.net/manual/en/language.operators.errorcontrol.php:
如果使用set_error_handler()设置了自定义错误处理函数 然后它仍然会被调用,但这个自定义错误处理程序可以(和 应该)调用error_reporting(),当调用时返回0 触发错误之前是@。
然而,CodeIgniter 2并没有这样做。为了隐藏CodeIgniter中的@suppressed错误,您需要编辑_exception_handler
中的system/core/Common.php
函数,以便在开头包含这些行:
if (error_reporting() == 0) {
return;
}
根据上面的链接,如果触发错误的调用前面有@,error_reporting()
将返回0。此代码将检查此问题,并阻止CodeIgniter记录此类错误。
答案 4 :(得分:0)
转到config / constants然后设置 defined('SHOW_DEBUG_BACKTRACE')或define('SHOW_DEBUG_BACKTRACE',TRUE);到 defined('SHOW_DEBUG_BACKTRACE')或define('SHOW_DEBUG_BACKTRACE',FALSE);