Как изменить способ, которым PHP записывает ошибки в файл журнала ошибок?
Я работаю над своим веб-сайтом уже более года, и я очень хочу наконец-то опубликовать его для использования людьми. Тем не менее, он стал довольно большим - я почти хочу сказать, что вышел из-под контроля - и вдобавок ко всему, я на самом деле просто программист-самоучка.
Поэтому я хочу быть уверен, что любые ошибки, которые выдает php, регистрируются в файле, поэтому я могу получить доступ к этому файлу и отследить ошибки.
В настоящее время мои настройки следующие:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', 1);
ini_set('error_log', 'errors.log');
?>
Пока работает довольно хорошо, мой файл error.log будет содержать такие вещи:
[14 мая 2013 г. 00:16:26] Примечание PHP: Неопределенная переменная: отсутствует переменная в /home/www/dir/index.php в строке 14[14 мая 2013 г. 00:16:28] Примечание PHP: неопределенная переменная: несуществующая переменная в /home/www/dir/index.php в строке 14
Отлично, ошибки записываются.
Но сейчас у меня проблема:
Все они в одну строку, без перерывов. Трудно читать. Как получить каждую ошибку в новой строке?
Я вижу, что есть отметка времени. Потрясающие! Как я могу также добавить такие вещи, как IP-адрес пользователя или любые другие пользовательские вещи?
Опять мои вопросы:
Как изменить способ, которым PHP записывает ошибки в файл журнала ошибок? В частности, как я могу сделать новую строку после каждой зарегистрированной ошибки, чтобы файл error.log был легче читать. И как я могу добавить пользовательские данные и значения, такие как IP-адреса?
ОТВЕТ: Я закончил тем, что сделал следующее - это, кажется, в некоторой степени воспроизводит то, что php делает по стандарту и может быть оттуда изменено.
<?php
function my_error_handler($type, $message, $file, $line, $vars)
{
switch($type)
{
case 1: // 1 //
$type_str = 'ERROR';
break;
case 2: // 2 //
$type_str = 'WARNING';
break;
case 4: // 4 //
$type_str = 'PARSE';
break;
case 8: // 8 //
$type_str = 'NOTICE';
break;
case 16: // 16 //
$type_str = 'CORE_ERROR';
break;
case 32: // 32 //
$type_str = 'CORE_WARNING';
break;
case 64: // 64 //
$type_str = 'COMPILE_ERROR';
break;
case 128: // 128 //
$type_str = 'COMPILE_WARNING';
break;
case 256: // 256 //
$type_str = 'USER_ERROR';
break;
case 512: // 512 //
$type_str = 'USER_WARNING';
break;
case 1024: // 1024 //
$type_str = 'USER_NOTICE';
break;
case 2048: // 2048 //
$type_str = 'STRICT';
break;
case 4096: // 4096 //
$type_str = 'RECOVERABLE_ERROR';
break;
case 8192: // 8192 //
$type_str = 'DEPRECATED';
break;
case 16384: // 16384 //
$type_str = 'USER_DEPRECATED';
break;
}
$errormessage = '[ '.date(r).' ] '.$type_str.': '.$message.' in '.$file.' on line '.$line."\n";
// for development simply ECHO $errormessage;
$file = 'my_errors.log';
file_put_contents($file, $errormessage, FILE_APPEND);
}
error_reporting(E_ALL);
ini_set('display_errors', '0');
set_error_handler('my_error_handler');
?>
1 ответ
Вы не можете выполнить какую-либо дополнительную настройку или реализовать какую-либо эту логику с помощью встроенного обработчика ошибок, вам нужно установить собственный обработчик ошибок с помощью set_error_handler()
,
Эта функция принимает обратный вызов, который будет вызван, когда PHP обнаружит ошибку, и вы можете действовать соответственно.
Смотрите пример в документации о том, как использовать эту функцию и как реализовать правильный обратный вызов.