Может войдёшь?
Черновики Написать статью Профиль

Ошибки и журнал

перевод документация 5.х

  1. 1. Введение
  2. 2. Настройка
  3. 3. Обработчик исключений
    1. 3.1. Метод PHPreport()
    2. 3.2. Метод PHPrender()
  4. 4. HTTP-исключения
    1. 4.1. Свои страницы HTTP-ошибок
  5. 5. Журналы
Этот перевод актуален для англоязычной документации на (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

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

Настройка

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

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

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

Режимы журналирования

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

PHP
'log' => 'daily'
+ 5.2

добавлено в 5.2 ()

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

PHP
'log_max_files' => 30

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

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

PHP
$app->configureMonologUsing(function($monolog) {
  
$monolog->pushHandler(...);
});

return 
$app;
+ 5.2

добавлено в 5.2 ()

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

PHP
'log_level' => env('APP_LOG_LEVEL''debug'),

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

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

Метод PHPreport()

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

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

PHP
/**
 * Сообщить или зарегистрировать исключение.
 *
 * Это отличное место для отправки исключений в Sentry, Bugsnag, и т.д.
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
  if (
$e instanceof CustomException) {
    
//
  
}

  return 
parent::report($e);
}

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

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

Метод PHPrender()

Метод PHPrender() отвечает за конвертацию исключения в HTTP-отклик, который должен быть возвращён браузеру. По умолчанию исключение передаётся в базовый класс, который генерирует для вас отклик. Но вы можете проверить тип исключения или вернуть ваш собственный отклик:

PHP
/**
 * Отрисовка HTTP-оклика для исключения.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($requestException $e)
{
  if (
$e instanceof CustomException) {
    return 
response()->view('errors.custom', [], 500);
  }

  return 
parent::render($request$e);
}

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

Некоторые исключения описывают коды HTTP-ошибок от сервера. Например, это может быть ошибка «страница не найдена» (404), «ошибка авторизации» (401) или даже сгенерированная разработчиком ошибка 500. Для возврата такого отклика из любого места в приложении делайте так:

PHP
abort(404);

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

PHP
abort(403'Unauthorized action.');

Этот метод может использоваться в любой момент прохождения запроса.

Свои страницы HTTP-ошибок

В Laravel можно легко возвращать свои собственные страницы для различных кодов HTTP-ошибок. Например, для выдачи собственной страницы для ошибки 404 создайте файл resources/views/errors/404.blade.php. Этот файл будет использован для всех ошибок 404, генерируемых вашим приложением.

+ 5.2

добавлено в 5.2 ()

Созданное методом PHPabort() исключение будет передано в представление как PHP$exception, что позволяет вам при необходимости выдать пользователю сообщение об ошибке.

PHP
$exception->getMessage()

Представления в этой папке должны иметь имена, соответствующие кодам ошибок.

Журналы

You may write information to the logs using the `Log` [facade](/docs//facades):

You may write information to the logs using the `Log` [facade](/docs//facades):

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

PHP
<?php

namespace App\Http\Controllers;

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.

PHP
Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);

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

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

PHP
Log::info('User failed to login.', ['id' => $user->id]);

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

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

PHP
$monolog Log::getMonolog();
+ 5.0

добавлено в 5.0 ()

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

Регистрация слушателя событий журнала

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

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.