Как изменить способ записи ошибок PHP в файл журнала ошибок?


Я работаю над своим сайтом уже больше года, и мне очень хочется наконец-то выложить его на всеобщее обозрение. Однако он стал довольно большим - я почти хочу сказать, из - под моего контроля-и вдобавок ко всему, я действительно просто программист-самоучка-любитель.

Поэтому я хочу быть уверен, что любые ошибки, которые производит php, регистрируются в файле, поэтому я могу получить доступ к этому файлу и отслеживать ошибки.

В настоящее время Мои настройки следующие: следующее:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', 1);
ini_set('error_log', 'errors.log');
?>

Работает довольно хорошо до сих пор, моя ошибка.лог-файл будет содержать примерно следующее:

[14-May-2013 00: 16: 26] PHP Notice: Undefined variable: nonexistentvariable in /home/www/dir/index.PHP на линии 14[14-мая-2013 00:16:28] обратите внимание на PHP: неопределенная переменная: nonexistentvariable в /home/www и/реж/индекс.php on line 14

Отлично, ошибки регистрируются.

Но теперь у меня есть проблема:

  1. Они все в одну линию, без перерывов. Сделать его трудно читать. Как получить каждую ошибку в новой строке?

  2. Я вижу, что есть отметка времени. Потрясающе! Как я могу также добавить такие вещи, как IP-адрес пользователя или любые другие пользовательские вещи?

И снова мои вопросы:

Как изменить способ записи ошибок PHP в файл журнала ошибок? в частности, как я могу сделать новую строку после каждой ошибки, которая была зарегистрирована, так что ошибка.лог-файл легче читать. И как я могу добавить пользовательские данные и значения, такие как как 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 4

1 ответ:

Вы не можете выполнить дополнительную настройку или реализовать любую из этих логик с помощью встроенного обработчика ошибок, вам нужно будет установить свой собственный обработчик ошибок с помощью встроенного обработчика ошибок.set_error_handler().

Эта функция принимает обратный вызов, который будет вызван, когда PHP столкнется с ошибкой, и вы можете действовать соответственно.

Смотрите пример в документации о том, как использовать эту функцию и как реализовать правильный обратный вызов.