代码点火器记录太多

时间:2009-12-18 15:46:47

标签: php codeigniter

在我的CI配置文件中,我设置了此日志记录阈值:

$config['log_threshold'] = 1;

在index.php中,我设置了以下错误报告:

error_reporting(E_ERROR);

我的期望是,这将记录我记录的任何CI错误(使用log_message('error','my error message')),以及任何PHP错误。但是,我希望它不会记录PHP通知,只会记录错误。但是,当我查看日志文件时,它似乎也记录了PHP通知:

  

错误 - 2009-12-18 13:21:50->严重性:通知 - >未定义的变量:pageindex /var/www/apps/OS4W/system/application/views/user/view.php 12
  错误 - 2009-12-18 13:21:50->严重性:通知 - >未定义的变量:friendsmode /var/www/apps/OS4W/system/application/views/user/activitytable.php 207

虽然日志行以“ERROR”开头,但实际上这似乎是一个PHP通知,有点像警告,我不想记录。如何确保仅记录CI和PHP错误,而不是PHP通知?我以为error_reporting(E_ERROR)会做到这一点?

7 个答案:

答案 0 :(得分:13)

首先,谢谢大家一起思考。在考虑了你的建议之后,我决定修补CI的核心。不幸的是,核心类可以扩展,但不是核心本身。因此,如果您应用相同的修补程序,请务必记录它。

到此为止。在system \ application \ config \ config.php中,我在log_treshold设置下面添加了以下自定义配置设置:

/*
|--------------------------------------------------------------------------
| Error Logging Exclusions (custom config addition by Ferdy Christant)
|--------------------------------------------------------------------------
|
| By default, CI will log all PHP errors, whether it is a notice, warning
| or error. Or, by setting the above treshold to 0, it will log nothing
| In most cases, however, you will want to log PHP errors but not the notices
| In the array below, simply place the PHP error constant that you do NOT
| want to see logged. 
|
| For a live site you'll usually use the config as follow:
|
| $config['exclude_logging'] = array(E_STRICT,E_NOTICE);
|
*/

$config['exclude_logging'] = array(E_STRICT,E_NOTICE);

正如文档所解释的那样,在这个配置数组中,你输入了 NOT 想要记录的PHP错误类型。

接下来,我修补了核心文件(system / codeigniter / Common.php)并编辑了函数_exception_handler

有两处变化。首先,我将配置加载行移动到方法的顶部,因为我之前需要它。找到下面的行,你会看到$ config =& get_config();在它下面。删除它。

我删除了//我们应该记录错误吗?没有?我们完成了......

其次,修改严重性检查以检查我们声明的数组。转到方法的顶部,并用以下内容替换检查$ severity == E_STRICT的if语句:

$config =& get_config();
if (in_array($severity,$config['exclude_logging']))
{
return;
}

这些补丁允许对PHP错误记录进行细粒度控制。正常的CI日志记录当然仍然有效。如上所述,唯一的缺点是这会破坏核心。

我希望这可以帮助任何人。谢谢你的思考!

答案 1 :(得分:6)

对于其他可能遇到CodeIgniter 2.0的人。问题仍然存在,但解决方案“更容易”。

您仍然需要修改核心文件:/system/codeigniter/Common.php

找到_exception_handler()函数(应位于底部),并更改此行:

if ($severity == E_STRICT) 对此: if ($severity == E_STRICT OR $severity == E_NOTICE)

有趣的是,他们认为E_STRICT 通知会填满日志;但是E_NOTICE不会。或者,在使用它们之前惩罚不严格编码并声明所有变量的人可能会有好处吗? :)

答案 2 :(得分:3)

根据http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

上的PHP错误报告文档
  

在PHP 4和PHP 5中的默认值   是E_ALL& 〜E_NOTICE。这个设置   不显示E_NOTICE级别错误。   你可能想在期间展示它们   发展。

我会尝试将您的error_reporting()更改为“E_ALL& ~E_NOTICE”并查看是否有效。

达纳

编辑:好吧,我说得太早了。我尝试了这个,它停止了通知显示在屏幕上,但仍然将其记录到日志文件中。

解决方案:

好吧,我想我想出来了。在common.php文件中有一个名为“_exception_handler”的函数来处理日志记录过程。它对当前严重性级别和error_reporting级别进行了一些按位比较,以查看它是否应该登录到屏幕,但是它不会记录到日志文件。除了E_STRICT消息之外,IT只会传递所有内容。

您可以做的是将此函数中的最后一行包装为用于登录屏幕的相同IF语句。所以整个功能变成:

function _exception_handler($severity, $message, $filepath, $line)
{   
 // We don't bother with "strict" notices since they will fill up
 // the log file with 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)
{
    return;
}

$error =& load_class('Exceptions');

// 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...
$config =& get_config();
if ($config['log_threshold'] == 0)
{
    return;
}

if (($severity & error_reporting()) == $severity)
{
    $error->log_exception($severity, $message, $filepath, $line);
}
}

我认为会照顾它。然后你可以使用

error_reporting(E_ALL & ~E_NOTICE);
你的index.php中的

。当然我们在这里编辑核心。也许有一种方法可以覆盖?

达纳

答案 3 :(得分:1)

在error_reporting方法调用中只需要一个下划线,PHP不会报告这些通知:

error_reporting(E_ERROR);

Code Igniter会将来自PHP的任何错误(无论是通知,警告或致命错误等)视为CI日志中的错误。

编辑:没关系,只看到你的评论。不确定您的错误报告发生了什么。

答案 4 :(得分:1)

我一直只是修改了CodeIgniter的日志库。 Ferdy是正确的,他说CI会记录一切或什么都没有。这是非常不受欢迎的。

答案 5 :(得分:1)

试试这个,不需要修补CI核心:

$hook['pre_controller'] = array(
    'class'    => 'MY_Commonfunction_hook',
    'function' => 'hook',
    'filename' => 'MY_Commonfunction_hook.php',
    'filepath' => 'hooks');

class MY_Commonfunction_hook {
    public function hook() {
        set_error_handler('_my_exception_handler');
    }
}

function _my_exception_handler($severity, $message, $filepath, $line) {
    if ($severity == E_STRICT) {
        return;
    }
    $_error = & load_class('Exceptions', 'core');
    if (($severity & error_reporting()) == $severity) {
        for ($i = ob_get_level(); $i > 0; $i--) {
            @ob_end_clean();
        }
        $_error->show_php_error($severity, $message, $filepath, $line);
    }
    if (config_item('log_threshold') == 0) {
        return;
    }
    if (($severity & error_reporting()) == $severity) {
        $_error->log_exception($severity, $message, $filepath, $line);
    }
}

答案 6 :(得分:0)

我通过更改库/ Log.php6中日志级别的ID来修复它,如:

变化:

protected $_levels  = array('ERROR' => '1', 'DEBUG' => '2',  'INFO' => '3', 'ALL' => '4');

到:

protected $_levels  = array('ERROR' => '1', 'DEBUG' => '3',  'INFO' => '2', 'ALL' => '4');