Версия фреймворка:
5.4 4.2
Прогресс перевода
Перевод немного отстаёт от оригинала. Коммитов не переведено: 1

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

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

Логгер регистрируется в старт-файле 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)
{
	//
});