Журнал и обработка ошибок
Журнал (лог) — файл, куда сайт записывает, что с ним происходило: ошибки, предупреждения, важные события. На рабочем сервере посетителю не показывают подробности сбоя, поэтому журнал — основной способ узнать, что пошло не так.
Где лежит журнал
Сообщения записываются в файл runtime/logs/app.log. Создавать его не нужно — он появляется сам. Все ошибки PHP и необработанные исключения попадают туда автоматически.
Запись сообщения
// controllers/PostController.php
public function actionDelete(int $id)
{
Post::findOne($id)?->delete();
Yii::warning("Статья $id удалена пользователем " . Yii::$app->user->id, 'post');
return $this->redirect(['post/index']);
}После удаления статьи в runtime/logs/app.log появится строка с датой, уровнем warning, категорией post и текстом. Второй аргумент — категория, произвольная метка для поиска и отбора.
Уровни
| Вызов | Когда использовать |
|---|---|
Yii::error() | Сбой, требующий внимания |
Yii::warning() | Подозрительное событие, работа продолжается |
Yii::info() | Обычное событие: вход пользователя, отправка письма |
Yii::debug() | Подробности для отладки, только в режиме разработки |
Настройка
Компонент log описан в config/web.php:
// config/web.php
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],Цель (target) определяет, куда и какие сообщения записывать. Здесь в файл попадают только ошибки и предупреждения; вызовы Yii::info() пропускаются. Чтобы писать и их, добавьте 'info' в levels.
Отдельный файл для категории
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\FileTarget',
'levels' => ['info', 'warning'],
'categories' => ['post'],
'logFile' => '@runtime/logs/post.log',
],
],Сообщения с категорией post будут записываться ещё и в runtime/logs/post.log. Есть и другие цели: yii\log\EmailTarget отправляет сообщения на почту, yii\log\DbTarget пишет их в таблицу.
Страница ошибки
Какую страницу показать при ошибке, определяет компонент errorHandler:
// config/web.php
'errorHandler' => [
'errorAction' => 'site/error',
],Действие site/error уже подключено в SiteController через готовый класс yii\web\ErrorAction, а его шаблон — views/site/error.php. В нём доступны переменные $name (например, «Not Found (#404)») и $message — текст исключения. Измените этот шаблон, чтобы страница ошибки выглядела по-своему.
В режиме разработки вместо этой страницы для сбоев в коде показывается подробный отчёт с местом ошибки и цепочкой вызовов.
Свои исключения
Чтобы вернуть посетителю нужный код ответа, бросают исключение:
use yii\web\HttpException;
throw new HttpException(410, 'Статья удалена.');Посетитель увидит страницу ошибки с кодом 410 и этим текстом. Для частых кодов есть готовые классы: NotFoundHttpException, ForbiddenHttpException.
Частая ошибка
Не записывайте в журнал пароли, ключи доступа и данные карт — например, целиком массив Yii::$app->request->post() из формы входа. Журнал хранится в открытом виде, его читают многие люди, и он попадает в резервные копии.