Ошибки и логирование
11.x
.
Почему это важно?
Конфигурация
Логгер регистрируется в старт-файле app/start/global.php
. По умолчанию логи пишутся в один файл, но вы можете изменить это поведение. Для ведения логов Laravel использует модуль Monolog.
Например, если вы не хотите, чтобы все логи писались в один огромный файл, а хотите разбивать свои лог-файлы по дням, то вам нужно вписать в app/start/global.php
следующее:
$logFile = 'laravel.log';
Log::useDailyFiles(storage_path().'/logs/'.$logFile);
Детализация ошибок
По умолчанию в Laravel включена детализация ошибок, происходящих в вашем приложении. Это значит, что при их возникновении будет отображена страница с цепочкой вызовов и текстом ошибки. Вы можете отключить детализацию ошибок установкой настройки debug
файла app/config/app.php
в значение false
.
Настоятельно рекомендуется отключать детализацю ошибок для рабочей среды
production
Обработка ошибок
По умолчанию, файл app/start/global.php
содержит обработчик всех исключений:
App::error(function(Exception $exception)
{
Log::error($exception);
});
Это самый примитивный обработчик. Однако вы можете зарегистрировать несколько обработчиков, если вам это нужно. Они будут вызываться в зависимости от типа Exception
, указанного в их первом аргументе. Например, вы можете создать обработчик только для ошибок RuntimeException
:
App::error(function(RuntimeException $exception)
{
// Обработка исключения...
});
Если обработчик возвращает ответ, он будет отправлен в браузер и никакие другие обработчики вызваны не будут:
App::error(function(InvalidUserException $exception)
{
Log::error($exception);
return 'Извини! Что-то не так с этим аккаунтом!';
});
Вы можете зарегистрировать обработчик критических ошибок PHP методом App::fatal
:
App::fatal(function($exception)
{
//
});
Если у вас несколько обработчиков ошибок в приложении, их определения должны быть расположены в порядке от наиболее общего до наиболее конкретного. Наример, обработчик, который обрабатывает Exception
должен быть определен раньше чем тот, который обрабатывает что-то вроде Illuminate\Encryption\DecryptException
Где располагать обрабтчики ошибок
Нет общепринятого места для определения обработчиков ошибок – вы вольны располагать их где вам удобно. Одним из вариантов может быть файл start/global.php
. Если вы не хотите перегружать этот файл, то можете создать, например, app/errors.php
и подключать его в start/global.php
. Третий вариант – создать сервис-провайдер, в котором вы будете регистрировать обработчики ошибок. Нет однозначно правильного ответа, где это делать – выберите то, что будет удобно лично для вас.
HTTP-исключения
Такие ошибки могут возникнуть во время обработки запроса от клиента. Это может быть ошибка “Страница не найдена” (http-код 404), “Требуется авторизация” (401) или даже “Ошибка сервера” (500). Для того, чтобы отправить такой ответ, используйте следующее:
App::abort(404);
Опционально, вы можете установить свой ответ для возврата в браузер:
App::abort(403, 'У вас нет прав для просмотра этой страницы.');
Эти исключения могут быть возбуждены на любом этапе обработки запроса.
Обработка 404
Вы можете зарегистрировать обработчик для всех ошибок 404 (“Не найдено”) в вашем приложении, что позволит вам отображать собственную страницу 404:
App::missing(function($exception)
{
return Response::view('errors.missing', array(), 404);
});
Логирование
Стандартный механизм логирования представляет собой простую надстройку над мощной системой Monolog. По умолчанию Laravel настроен так, чтобы хранить все логи в одном файле – app/storage/logs/laravel.log
. Вы можете записывать в него информацию таким образом:
Log::info('Вот кое-какая полезная информация.');
Log::warning('Что-то может идти не так.');
Log::error('Что-то действительно идёт не так.');
Журнал предоставляет 7 уровней критичности, определённые в RFC 5424 (в порядке возрастания – прим. пер.): debug, info, notice, warning, error, critical и alert.
В метод записи можно передать массив данных о текущем состоянии:
Log::info('Log message', array('context' => 'Другая полезная информация.'));
Monolog имеет множество других методов, которые вам могут пригодиться. Если нужно, вы можете получить экземпляр его класса:
$monolog = Log::getMonolog();
Вы также можете зарегистрировать обработчик событий для отслеживания всех новых сообщений:
Отслеживание новых сообщений в логе
Log::listen(function($level, $message, $context)
{
//
});