Слишком много логов - PullRequest
       16

Слишком много логов

10 голосов
/ 18 декабря 2009

В моем конфигурационном файле 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

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

Ответы [ 7 ]

13 голосов
/ 21 декабря 2009

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

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

6 голосов
/ 27 июля 2011

Для всех, кто может столкнуться с этим с 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 голосов
/ 18 декабря 2009

В соответствии с документами об ошибках 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, чтобы увидеть, должен ли он регистрироваться на экране, но он не делает этого для регистрации в файле журнала. Он просто пропускает все, кроме сообщений 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

1 голос
/ 07 февраля 2012

попробуйте это, не нужно исправлять ядро ​​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);
    }
}
1 голос
/ 19 декабря 2009

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

1 голос
/ 18 декабря 2009

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

error_reporting(E_ERROR);

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

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

0 голосов
/ 30 июля 2013

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

изменение:

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

до:

protected $_levels  = array('ERROR' => '1', 'DEBUG' => '3',  'INFO' => '2', 'ALL' => '4');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...