Ошибки и логирование

Конфигурация

Возможности логгирования для вашего приложения описаны в классе Illuminate\Foundation\Bootstrap\ConfigureLogging. Это класс использует параметр log из файла config/app.php.

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

Например, если вы хотите, чтобы все логи писались в один файл вместо ежедневной смены файла, вы можете изменить файл config/app.php так:

'log' => 'single'

«Из коробки» Laravel поддерживает три режима логгирования: single, daily, and syslog, но вы можете настроить механизм логгирования так, как вам нужно путём переопределения класса ConfigureLogging.

Детализация ошибок

Подробная детализация ошибок вашего приложения, отображаемая в браузере, контролируется параметром app.debug в файле config/app.php По умолчанию этот параметр определяется переменной среды окружения APP_DEBUG, которая установлена в файле .env.

Во время разработки на локальной машине рекомендуется установить значение переменной APP_DEBUG в true.

Примечание Настоятельно рекомендуется отключать детализацю ошибок для рабочей среды выполнения.

Обработка ошибок

Все исключения обрабатываются классом App\Exceptions\Handler, который содержит два метода: report и render

Метод report используется для логгирования исключений в файл или отправки информации на сторонний сервис логгирования типа BugSnag. По умолчанию, метод report просто передаёт исключение своему базовому классу, который его логгирует, однако вы можете изменить это поведение. Если необходимо обрабатывать разные типы исключений разными путями, то можно использовать оператор PHP instanceof:

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
    if ($e instanceof CustomException)
    {
        //
    }

    return parent::report($e);
}

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

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

HTTP-исключения

Такие ошибки могут возникнуть во время обработки запроса от клиента. Это может быть ошибка "Страница не найдена" (http-код 404), "Требуется авторизация" (401) или даже "Ошибка сервера" (500). Для того, чтобы отправить такой ответ, используйте следующее:

abort(404);

Опционально, вы можете установить свой ответ для возврата в браузер:

abort(403, 'Unauthorized action.');

Эти исключения могут быть возбуждены на любом этапе обработки запроса.

Изменение страницы 404

Для изменения страницы, выдаваемой при ошибке 404, необходимо создать файл resources/views/errors/404.blade.php.

Логирование

Стандартный механизм логирования представляет собой простую надстройку над мощной системой Monolog. По умолчанию Laravel настроен так, чтобы создавать новый лог-файл каждый день в каталоге storage/logs. Вы можете записывать в лог информацию таким образом:

Log::info('Вот кое-какая полезная информация.');

Log::warning('Что-то может идти не так.');

Log::error('Что-то действительно идёт не так.');

Журнал предоставляет 7 уровней критичности, определённые в RFC 5424: debug, info, notice, warning, error, critical и alert.

В метод записи можно передать массив данных о текущем состоянии:

Log::info('Log message', ['context' => 'Другая полезная информация.']);

Monolog имеет множество других методов, которые вам могут пригодиться. Если нужно, вы можете получить экземпляр его класса:

$monolog = Log::getMonolog();

Вы также можете зарегистрировать обработчик событий для отслеживания всех новых сообщений:

Отслеживание новых сообщений в логе

Log::listen(function($level, $message, $context)
{
    //
});