В моем файле конфигурации 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)
сделал бы просто это?
Прежде всего, спасибо всем за то, что подумали. Обдумав ваш совет, я решил пропатчить ядро 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, конечно, по-прежнему будет работать. Как уже упоминалось, единственным недостатком является то, что это исправляет ядро.
Надеюсь, это кому-нибудь поможет. Спасибо, что подумали!
Согласно документам отчетов об ошибках 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. Конечно, мы здесь редактируем ядро. Может, вместо этого есть способ переопределить?
Дана
Вам нужно всего одно подчеркивание в вызове метода error_reporting, чтобы PHP не сообщал об этих уведомлениях:
error_reporting(E_ERROR);
Code Igniter обработает любую ошибку из PHP (будь то уведомление, предупреждение или фатальный ошибка и т. д.) как ошибку в журналах CI.
Edit: Неважно, только что видел ваш комментарий. Не уверен, что происходит с вашим сообщением об ошибке.
Я всегда модифицировал эту библиотеку протоколирования CodeIgniter. Ферди прав, когда говорит, что CI будет протоколировать либо все, либо ничего. Это очень нежелательно.