Ошибки и журнал
Этот перевод актуален для англоязычной документации на 28.01.2017 (ветка 5.3) , 08.12.2016 (ветка 5.2) , 19.06.2016 (ветка 5.1) и 08.02.2016 (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.
Введение
Когда вы начинаете новый 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 :
Уровни важности событий
При использовании Monolog сообщения в журнале могут иметь разные уровни важности. По умолчанию Laravel сохраняет в журнал события всех уровней. Но на продакшн-сервере вы можете задать минимальный уровень важности, который необходимо заносить в журнал, добавив параметр conf log_level в файл app.php .
После задания этого параметра Laravel будет записывать события всех уровней начиная с указанного и выше. Например, при conf log_level равном error будут записываться события error, critical, alert и emergency:
conf'log_level' => env('APP_LOG_LEVEL', 'error'),
В Monolog используются следующие уровни важности — от меньшего к большему: debug , info , notice , warning , error , critical , alert , emergency .
Изменение настроек Monolog
Если вы хотите иметь полный контроль над конфигурацией Monolog для вашего приложения, вы можете использовать метод приложения PHP configureMonologUsing () . Вызов этого метода необходимо поместить в файл bootstrap/app.php прямо перед тем, как в нём возвращается переменная PHP $app :
$app->configureMonologUsing(function ($monolog) $monolog->pushHandler(. );
>);
return $app;
Обработчик исключений
Метод PHP report ()
Все исключения обрабатываются классом App\Exceptions\Handler . Этот класс содержит два метода: PHP report () и PHP render () . Рассмотрим каждый из них подробнее. Метод PHP report () используется для занесения исключений в журнал или для отправки их во внешний сервис, такой как BugSnag или Sentry. По умолчанию метод PHP report () просто передаёт исключение в базовую реализацию родительского класса, где это исключение зафиксировано. Но вы можете регистрировать исключения как пожелаете.
Например, если вам необходимо сообщать о различных типах исключений разными способами, вы можете использовать оператор сравнения PHP PHP instanceof ::
/**
* Сообщить или зарегистрировать исключение.
*
* Это отличное место для отправки исключений в Sentry, Bugsnag, и т.д.
*
* @param \Exception $exception
* @return void
*/ public function report(Exception $exception)
if ($exception instanceof CustomException) // >
return parent::report($exception);
>
Игнорирование исключений заданного типа
Свойство обработчика исключений PHP $dontReport содержит массив с типами исключений, которые не будут заноситься в журнал. Например, исключения, возникающие при ошибке 404, а также при некоторых других типах ошибок, не записываются в журналы. При необходимости вы можете включить другие типы исключений в этот массив:
/**
* Список типов исключений, о которых не надо сообщать.
*
* @var array
*/ protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Validation\ValidationException::class,
];
Метод PHP render ()
Метод PHP render () отвечает за конвертацию исключения в HTTP-отклик, который должен быть возвращён браузеру. По умолчанию исключение передаётся в базовый класс, который генерирует для вас отклик. Но вы можете проверить тип исключения или вернуть ваш собственный отклик:
/**
* Отрисовка HTTP-оклика для исключения.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/ public function render($request, Exception $exception)
if ($exception instanceof CustomException) return response()->view('errors.custom', [], 500);
>
return parent::render($request, $exception);
>
HTTP-исключения
Некоторые исключения описывают коды HTTP-ошибок от сервера. Например, это может быть ошибка «страница не найдена» (404), «ошибка авторизации» (401) или даже сгенерированная разработчиком ошибка 500. Для возврата такого отклика из любого места в приложении можете использовать вспомогательный метод PHP abort () :
Вспомогательный метод PHP abort () немедленно создаёт исключение, которое будет отрисовано обработчиком исключений. Или вы можете предоставить такой отклик:
abort(403, 'Unauthorized action.');
Свои страницы HTTP-ошибок
В Laravel можно легко возвращать свои собственные страницы для различных кодов HTTP-ошибок. Например, для выдачи собственной страницы для ошибки 404 создайте файл resources/views/errors/404.blade.php . Этот файл будет использован для всех ошибок 404, генерируемых вашим приложением. Представления в этой папке должны иметь имена, соответствующие кодам ошибок. Экземпляр HttpException , созданный функцией PHP abort () , будет передан в представление как переменная PHP $exception .
Журналы
Laravel обеспечивает простой простой уровень абстракции над мощной библиотекой Monolog. По умолчанию Laravel настроен на создание файла журнала в storage/logs . Вы можете записывать информацию в журнал при помощи фасада Log :
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log; //для версии 5.2 и ранее:
//use Log; use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller /**
* Показать профиль данного пользователя.
*
* @param int $id
* @return Response
*/ public function showProfile($id)
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
>
>
Регистратор событий предоставляет восемь уровней журналирования, описанных в RFC 5424: debug, info, notice, warning, error, critical, alert и emergency.
Log::emergency($message); Log::alert($message); Log::critical($message); Log::error($message); Log::warning($message); Log::notice($message); Log::info($message); Log::debug($message);
Контекстная информация
Также в методы журналирования может быть передан массив контекстных данных:
Log::info('User failed to login.', ['id' => $user->id]);
Обращение к низкоуровневому экземпляру Monolog
В Monolog доступно множество дополнительных обработчиков для журналов. При необходимости вы можете получить доступ к низкоуровневому экземпляру Monolog, используемому в Laravel:
Вы также можете зарегистрировать событие для перехвата всех сообщений, передаваемых в журнал.
Регистрация слушателя событий журнала
Log::listen(function($level, $message, $context)
// >);
Комментарии (1)
v5.5 При использовании режима daily, каждый новый файл создается с ограниченными правами и выпадает ошибка permission deny для этого нового файла. Исправляет только ручное изменение прав на каждый новый дневной файл
- Аутентификация
- Авторизация (5.1+)
- Оплата (биллинг)
- Кэш
- Коллекции
- Командная шина
- Расширение фреймворка
- Elixir
- Шифрование
- Envoy
- Scout
- Ошибки и журнал
- События
- Файловая система и облака
- API Authentication (Passport)
- Хэширование
- Функции
- Локализация
- Работа с e-mail
- Разработка пакетов
- Страничный вывод
- Очереди
- Сессии
- Шаблоны Blade (5.1+)
- Шаблоны (5.0)
- Планировщик
- Юнит-тесты
- Проверка ввода
- JavaScript и CSS
- Сброс пароля
Статистика: Символов — 8 885/7 607 без пробелов (5 381/4 646 без кода):, слов — 736
Наверх Опечатка? Выдели и нажми Ctrl+Enter (Orphus.ru)