Воспламенитель кода, регистрирующийся слишком много

В моем файле конфигурации CI у меня есть этот вход treshold набор:

$config['log_threshold'] = 1;

В index.php я установил следующее сообщение об ошибке:

error_reporting(E_ERROR);

Мое ожидание состоит в том, что это зарегистрирует любые ошибки CI, которые я регистрирую (использование log_message('error','my error message')), а также любые ошибки PHP. Однако я ожидал бы, что это не зарегистрирует уведомления PHP, только ошибки. Однако, когда я смотрю на файлы журнала, это, кажется, регистрирует уведомления PHP также:

ОШИБКА - 18.12.2009 13:21:50 —> Серьезность: Заметьте —> Неопределенная переменная: pageindex/var/www/apps/OS4W/system/application/views/user/view.php 12
ОШИБКА - 18.12.2009 13:21:50 —> Серьезность: Заметьте —> Неопределенная переменная: friendsmode/var/www/apps/OS4W/system/application/views/user/activitytable.php 207

Хотя строки журнала запускаются с “ОШИБКИ”, в действительности это, кажется, уведомление PHP, отчасти как предупреждение, которое я не хочу регистрировать. Как я могу удостовериться, только CI и ошибки PHP зарегистрированы, уже не уведомления PHP? Я думал error_reporting(E_ERROR) сделал бы просто это?

10
задан hakre 16 June 2012 в 08:35
поделиться

4 ответа

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

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

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

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

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

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

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

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

13
ответ дан 3 December 2019 в 16:29
поделиться

Согласно документам отчетов об ошибках 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" и посмотреть, работает ли это.

Дана

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

Решение:

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

Дана

3
ответ дан 3 December 2019 в 16:29
поделиться

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

error_reporting(E_ERROR);

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

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

1
ответ дан 3 December 2019 в 16:29
поделиться

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

1
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: