Ведение журнала ошибок PHP - PullRequest
       31

Ведение журнала ошибок PHP

6 голосов
/ 22 августа 2011

Я недавно приступил к разработке устаревшей системы и хочу иметь возможность включить ведение журнала PHP E_NOTICE в среде развертывания.Среда развертывания ini имеет следующие директивы ...

error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
log_errors = On

Я сравнил битовую маску error_reporting с использованием echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting();, и обе совпадают, поэтому я знаю, что уровень error_reporting не изменилсяв самой системе, и если я включаю display_errors = On уведомления отображаются, но не регистрируются.

Так, как я могу начать регистрацию PHP E_NOTICE?

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Обновление:

Согласно @mpc в комментариях к этому ответу, ошибки отображаются в браузере при включенном display_errors, но не появляются вжурнал.Я предполагал, что ошибки вообще не появляются.

Являются ли ошибки E_NOTICE единственными, которые не появляются в журнале, или все типы ошибок затрагиваются?Если это все типы ошибок, то первое, что я хотел бы проверить, - включено ли ведение журнала ошибок.Попробуйте установить ini_set('log_errors', 'On'); в верхней части вашего скрипта.Если это не сработает, попробуйте установить в файле журнала что-то, что вы уверены , на который ваш сервер может писать, позвонив по номеру ini_set('error_log', 'your_file_path');.Если ничего из этого не работает, то я думаю, что что-то не так с вашей установкой PHP.Если какое-либо из этих исправлений работает, вы можете поместить их в свой фактический php.ini, если у вас есть доступ.


Оригинальный ответ:

На основе error_reporting уровень в вашем вопросе, ваша установка PHP уже должна быть настроена для сообщения E_NOTICE ошибок.Если это не регистрирует эти ошибки, что-то не так.Я бы предложил включить display_errors, чтобы увидеть, отображаются ли какие-либо ошибки E_NOTICE.Если вы не можете изменить файл php.ini, попробуйте запустить ini_set('display_errors', 'On'); вверху вашего скрипта.Очевидно, что эти ошибки будут отображаться и / или регистрироваться только в том случае, если вы их активируете, поэтому вам следует дважды проверить, что вы на самом деле это где-то делаете.

Одно предостережение: уровень ошибок E_DEPRECATED был тольковведено в PHP 5.3.Когда я только что протестировал установку E_DEPRECATED при установке PHP 5.2, PHP ответил с ошибками и установил уровень error_reporting на 0, что означает, что он сообщает без ошибок .Хотя для файла до версии 5.3 php.ini не имеет смысла использовать этот параметр, я считаю важным хотя бы повысить вероятность того, что вы используете E_DEPRECATED на сервере, который его не поддерживает.Если вы не уверены в своей версии, вы можете запустить phpinfo(), и она отобразит страницу с большим количеством информации, включая номер версии для вашей установки.

Несмотря на вышесказанное, если я 'Если вы неправильно поняли ваш вопрос, а вы говорите только о создании собственной настраиваемой регистрации, вам нужно создать функцию для запуска при возникновении ошибки и назначить ее в качестве обработчика ошибок с помощью функции set_error_handler().

Важно отметить, что когда вы используете set_error_handler(), вы полностью игнорируете обработчик ошибок PHP.Это означает, что ваш уровень error_handler становится бессмысленным.Все ошибки, независимо от их серьезности, будут переданы созданной вами функции обработчика ошибок.Первым параметром, переданным этой функции PHP, будет номер ошибки, который представляет собой числовое значение константы E_xxx найденной ошибки.Вам нужно будет написать собственный код, чтобы перехватывать только те ошибки, которые вы хотите.

Например, чтобы поймать только E_NOTICE ошибок, ваша функция будет выглядеть так:

function my_error_handler($errno, $errstr, $errfile, $errline) {
  if ($errno == E_NOTICE) {
    // handle/log the error
  } 
}

set_error_handler("my_error_handler");
2 голосов
/ 23 августа 2011

Оказывается, в системе определена пользовательская директива Apache ErrorLog, и я был tail -f ... по умолчанию Apache error_log.

Примечание для себя: всегда проверяйте настройку веб-сервера передразмещение глупых вопросов на SO!

0 голосов
/ 22 августа 2011

Вы можете создать свой собственный обработчик

<?php


function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ($errno == E_USER_NOTICE){
        /*  log actions here */
    }
}

set_error_handler("myErrorHandler");
...