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

Я недавно приступил к разработке устаревшей системы и хочу иметь возможность включить ведение журнала 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"S?

3 ответа

Решение

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

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

Обновить:

Согласно @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");

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

<?php


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

set_error_handler("myErrorHandler");
Другие вопросы по тегам