Код Зажигание слишком много
В моем конфигурационном файле 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');