Ведение журнала ошибок 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");