Laravel вывод ошибок в браузере

Обновлено: 06.07.2024

Например, если вы хотите использовать однодневные файлы журналов, а не один большой файл, вы можете сделать следующее изменение в вашем старт-файле:

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

По умолчанию в Laravel включена детализация ошибок, происходящих в вашем приложении. Это значит, что при их возникновении будет отображена страница с цепочкой вызовов и текстом ошибки. Вы можете отключить детализацию ошибок установкой настройки debug файла app/config/app.php в значение PHP false .

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

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

Файл app/start/global.php по умолчанию содержит обработчик любых исключений:

Это самый примитивный обработчик. Однако вы можете зарегистрировать несколько обработчиков, если вам это нужно. Они будут вызываться в зависимости от типа PHP Exception , указанного в их первом аргументе. Например, вы можете создать обработчик только для ошибок PHP RuntimeException :

Если обработчик возвращает ответ, он будет отправлен в браузер и никакие другие обработчики вызваны не будут:

Вы можете зарегистрировать обработчик критических ошибок PHP методом PHP App :: fatal () :

Если у вас есть несколько обработчиков исключений, то они должны быть определены по порядку от самого общего до самого конкретного. Например, обработчик, который обрабатывает все исключения типа PHP Exeption должен быть определён перед тем, который обрабатывает пользовательский тип исключений, такой как PHP Illuminate \ Encryption \ DecryptException .

Где разместить обработчики ошибок

Для регистрации обработчиков ошибок нет места по умолчанию. В этом Laravel предоставляет вам полную свободу. Одним из вариантов — определение обработчиков в вашем файле start/global.php . В общем это удобное расположение для размещения любого кода начальной загрузки. Если файл разрастается, то вы можете создать файл app/errors.php , и «запрашивать» этот файл из вашего скрипта start/global.php . Третий вариант — создать поставщик услуг, который будет регистрировать обработчиков. Опять же, здесь нет единственного «правильного» варианта. Выберите то место, которое вас устраивает.

При желании, вы можете указать описание:

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

Обработка 404

Вы можете зарегистрировать обработчик для всех ошибок 404 ( «Не найдено» ) в вашем приложении, что позволит вам легко отображать собственную страницу 404:

Журнал

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

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

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

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

В Laravel обработка исключений ведётся классом App\Exceptions\Handler . Возникшие исключения логируются и при необходимости показываются пользователю. Давайте рассмотрим работу этого класса поподробнее.

Настройка

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

Обработчик исключений

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

Метод Report

Метод report используется для логирование исключений или для отправки их во внешний сервис, такой как Flare, Bugsnag или Sentry. По умолчанию метод report просто передаёт исключение в базовую реализацию родительского класса, где это происходит запись исключения в лог-файл. Но вы можете регистрировать исключения как пожелаете.

Например, если вам необходимо сообщать о различных типах исключений разными способами, вы можете использовать оператор сравнения PHP instanceof :

Глобальный контекст для логирования

Хелпер report

Иногда вам надо зафиксировать наличие исключения, но продолжить обрабатывать запрос. Хелпер report поможет это сделать, без рендеринга страницы ошибки:

Игнорирование исключений по типу

Свойство $dontReport класса App\Exceptions\Handler содержит массив типов исключений, которые не будут логироваться. Например, в лог-файлы не записываются исключения ошибок 404, а также некоторые другие типы ошибок. При необходимости в этот массив можно добавить и другие типы исключений:

Метод Render

Reportable и Renderable исключения

Фреймворк также позволяет добавить зависимости в аргументы метода report - они будут автоматически подгружены при помощи сервис-контейнера

Хелпер abort немедленно создаёт исключение, которое будет отрисовано обработчиком исключений. Или вы можете предоставить такой отклик:

Для того, чтобы сделать свою страницу для показа в случае возникновения ошибки 404 - создайте файл resources/views/errors/404.blade.php . Со страницами по ошибкам с другими кодами - действия аналогичны, располагайте blade-файлы с кодом ошибки в названии в папке resources/views/errors . Исключение будет доступно в переменной $exception :

Чтобы опубликовать в вашем приложении дефолтные страницы ошибок Laravel (например, для того, чтобы их изменить), воспользуйтесь artisan-командой vendor::publish с указанным тэгом:

Когда вы начинаете новый Laravel проект, обработка ошибок и исключений уже настроена для вас. Все происходящие в вашем приложении исключения записываются в журнал и отображаются пользователю в классе App\Exceptions\Handler . В этой документации мы подробно рассмотрим этот класс.

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

Настройка

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

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

Для локальной разработки вам следует установить переменную среды APP_DEBUG в значение true . В продакшн-среде эта переменная всегда должна иметь значение false . Если значение равно true , на продакшн-сервере, вы рискуете раскрыть важные значения настроек вашим конечным пользователям.

Хранилище логов

Изначально Laravel поддерживает запись журналов в единые файлы single , в отдельные файлы для каждого дня daily , в syslog и errorlog . Для использования определённого механизма хранения вам надо изменить параметр log в файле config/app.php . Например, если вы хотите использовать ежедневные файлы логов вместо единого файла, вам надо установить значение log равное daily в файле настроек app :

Максимальное число ежедневных файлов логов

При использовании режима daily Laravel по умолчанию хранит логи только за последние пять дней. Если вы хотите изменить число хранимых файлов, добавьте в файл app значение для параметра log_max_files :

Коды серьёзности логов

После задания этого параметра Laravel будет записывать события всех уровней начиная с указанного и выше. Например, при log_level равном error будут записываться события error, critical, alert и emergency:

В Monolog используются следующие уровни серьёзности — от меньшего к большему: debug , info , notice , warning , error , critical , alert , emergency .

Пользовательская настройка Monolog

Если вы хотите иметь полный контроль над конфигурацией Monolog для вашего приложения, вы можете использовать метод приложения configureMonologUsing . Вызов этого метода необходимо поместить в файл bootstrap/app.php прямо перед тем, как в нём возвращается переменная $app :

Обработчик исключений

Метод Report

Все исключения обрабатываются классом App\Exceptions\Handler . Этот класс содержит два метода: report и render . Рассмотрим каждый из них подробнее. Метод report используется для занесения исключений в журнал или для отправки их во внешний сервис, такой как Bugsnag или Sentry. По умолчанию метод report просто передаёт исключение в базовую реализацию родительского класса, где это исключение зафиксировано. Но вы можете регистрировать исключения как пожелаете.

Например, если вам необходимо сообщать о различных типах исключений разными способами, вы можете использовать оператор сравнения PHP instanceof :

Игнорирование исключений заданного типа

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

Метод Render

Хелпер abort немедленно создаёт исключение, которое будет отрисовано обработчиком исключений. Или вы можете предоставить такой отклик:

Логгирование

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

Регистратор событий предоставляет восемь уровней логгирования, как описано в RFC 5424: emergency, alert, critical, error, warning, notice, info и debug.

Контекстная информация

Также в методы логгирования можно передать массив контекстных данных:

Обращение к расположенному ниже экземпляру Monolog

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

Когда вы начинаете новый Laravel проект, обработка ошибок и исключений уже настроена для вас. Все происходящие в вашем приложении исключения записываются в журнал и отображаются пользователю в классе App\Exceptions\Handler . В этой статье мы подробно рассмотрим этот класс.

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

Настройка

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

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

Для локальной разработки вам следует установить переменную среды APP_DEBUG в значение true . В продакшн-среде эта переменная всегда должна иметь значение false . Если значение равно true на продакшн-сервере, вы рискуете раскрыть важные значения настроек вашим конечным пользователям.

Хранилище журналов

Изначально Laravel поддерживает запись журналов в единый файл ( single ), в отдельные файлы за каждый день ( daily ), в syslog и errorlog . Для использования определённого механизма хранения вам надо изменить параметр conf log в файле config/app.php . Например, если вы хотите использовать ежедневные файлы журнала вместо единого файла, вам надо установить значение log равное daily в файле настроек app :

Максимальное число ежедневных файлов журнала

При использовании режима daily Laravel по умолчанию хранит журналы только за последние 5 дней. Если вы хотите изменить число хранимых файлов, добавьте в файл app значение для параметра log_max_files :

Уровни важности событий

После задания этого параметра Laravel будет записывать события всех уровней начиная с указанного и выше. Например, при conf log_level равном error будут записываться события error, critical, alert и emergency:

В Monolog используются следующие уровни важности — от меньшего к большему: debug , info , notice , warning , error , critical , alert , emergency .

Изменение настроек Monolog

Если вы хотите иметь полный контроль над конфигурацией Monolog для вашего приложения, вы можете использовать метод приложения PHP configureMonologUsing () . Вызов этого метода необходимо поместить в файл bootstrap/app.php прямо перед тем, как в нём возвращается переменная PHP $app :

Обработчик исключений

Метод PHP report ()

Все исключения обрабатываются классом App\Exceptions\Handler . Этот класс содержит два метода: PHP report () и PHP render () . Рассмотрим каждый из них подробнее. Метод PHP report () используется для занесения исключений в журнал или для отправки их во внешний сервис, такой как BugSnag или Sentry. По умолчанию метод PHP report () просто передаёт исключение в базовую реализацию родительского класса, где это исключение зафиксировано. Но вы можете регистрировать исключения как пожелаете.

Например, если вам необходимо сообщать о различных типах исключений разными способами, вы можете использовать оператор сравнения PHP PHP instanceof ::

Игнорирование исключений заданного типа

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

Метод PHP render ()

Вспомогательный метод PHP abort () немедленно создаёт исключение, которое будет отрисовано обработчиком исключений. Или вы можете предоставить такой отклик:

Журналы

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

Регистратор событий предоставляет восемь уровней журналирования, описанных в RFC 5424: debug, info, notice, warning, error, critical, alert и emergency.

Контекстная информация

Также в методы журналирования может быть передан массив контекстных данных:

Обращение к низкоуровневому экземпляру Monolog

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

Комментарии (1)

v5.5 При использовании режима daily, каждый новый файл создается с ограниченными правами и выпадает ошибка permission deny для этого нового файла. Исправляет только ручное изменение прав на каждый новый дневной файл

Читайте также: