Код Зажигание слишком много

В моем конфигурационном файле 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- > Уровень важности: Примечание → Undefined: pageindex/var/www/apps/OS4W/system/application/views/user/view. php 12
ERROR - 2009-12-18 13: 21: 50- > Уровень важности: Примечание → Undefined variable: friendsmode/var/www/apps/OS4W/system/application/views/user/activitytable.php 207

Хотя строки журнала начинаются с "ERROR", на самом деле это, кажется, уведомление PHP, вроде как предупреждение, которое я не хочу регистрировать. Как я могу убедиться, что регистрируются только ошибки CI и PHP, но не PHP-уведомления? Я думал, что error_reporting(E_ERROR) сделает именно это?

Ответ 1

Прежде всего, спасибо всем за то, что вы думаете. Рассмотрев ваши рекомендации, я решил исправить ядро ​​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);

Как объясняется в документации, в этом массиве конфигурации вы помещаете типы ошибок PHP, которые вы выполняете НЕ, чтобы регистрироваться.

Затем я закрепил основной файл (system/codeigniter/Common.php) и отредактировал функцию _exception_handler

Есть два изменения. Во-первых, я переместил строку загрузки конфигурации в начало метода, так как мне это нужно раньше. Найдите строку ниже, и вы увидите $config = & Get_Config(); под ним. Удалите это.

Я удалил//Если мы запустим ошибку? Нет? Мы закончили...

Во-вторых, проверка на серьезность изменяется для проверки объявленного массива. Перейдите в начало метода и замените оператор if, который проверяет $severity == E_STRICT ниже:

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

Эти патчи позволяют осуществлять мелкомасштабный контроль за регистрацией ошибок PHP. Естественно, нормальный CI-журнал будет работать. Как уже упоминалось, единственным недостатком является то, что это исправляет ядро.

Я надеюсь, что это поможет кому угодно. Спасибо, что подумали!

Ответ 2

Для всех, кто может столкнуться с этим с помощью 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 не будет. Или, может быть, хорошо наказывать людей за то, что они не строго кодируются и объявляют все свои переменные перед их использованием?:)

Ответ 3

В соответствии с документами отчетов об ошибках PHP в http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

В PHP 4 и PHP 5 значение по умолчанию E_ALL и ~ E_NOTICE. Этот параметр не показывает ошибки уровня E_NOTICE. Вы можете показать их во время развитие.

Я попробую изменить error_reporting() на "E_ALL и ~ E_NOTICE" и посмотреть, работает ли это.

Dana

Править: Хорошо, я говорил слишком рано. Я попробовал это, и это остановило уведомление о появлении на экране, но все равно записало его в файл журнала.

Решение:

ОК, я думаю, я понял это. В файле common.php есть функция "_exception_handler", которая обрабатывает процесс ведения журнала. Он выполняет побитовые сравнения текущего уровня серьезности и уровня error_reporting, чтобы проверить, должен ли он регистрироваться на экране, но он не делает этого для входа в файл журнала. IT просто передает все, за исключением сообщений E_STRICT, которые он независимо отбрасывает.

Что вы можете сделать, это обрезать последнюю строку в этой функции с помощью того же оператора 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. Конечно, мы редактируем ядро ​​здесь. Может быть, есть способ переопределить?

Dana

Ответ 4

В вызове метода error_reporting требуется только одно подчеркивание: PHP не сообщает эти уведомления:

error_reporting(E_ERROR);

Code Igniter будет обрабатывать любую ошибку с PHP (будь то уведомление, предупреждение или фатальная ошибка и т.д.) в качестве ошибки в ваших журналах CI.

Edit: Nevermind, просто увидел ваш комментарий. Не уверен, что происходит с сообщениями об ошибках.

Ответ 5

Я всегда только что изменил эту библиотеку регистрации CodeIgniter. Ферди прав, когда говорит, что CI запишет либо все, либо ничего. Это очень нежелательно.

Ответ 6

попробуйте это, нет необходимости исправлять ядро ​​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);
    }
}

Ответ 7

i исправил его, изменив идентификаторы для уровней журнала в библиотеках /Log.php6 как:

изменения:

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

to:

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