Когда ваше приложение начинает жить своей жизнью, рано или поздно наступает момент, когда оно делает что-то неожиданное. Ошибки, медленные запросы, странные баги — всё это часть разработки. Но как понять, что происходит под капотом? Ответ прост: логирование и отладка. В этой статье я расскажу, как настроить их в Yii2 так, чтобы вы тратили меньше времени на поиск проблем и больше — на их решение.
Почему логирование — это важно
Представьте, что ваше приложение — это автомобиль. Логи — это приборная панель. Без неё вы едете вслепую: не знаете, сколько топлива осталось, не видите, что двигатель перегревается. В разработке логи — это та самая панель, которая показывает, что происходит внутри системы. Они помогают:
- Находить ошибки, которые невозможно воспроизвести вручную.
- Отслеживать медленные запросы и узкие места.
- Понимать поведение пользователей и системы.
- Анализировать инциденты после их возникновения.
Без настроенного логирования вы будете гадать, почему что-то сломалось, вместо того чтобы просто посмотреть в файл. А это потерянное время, нервы и деньги.
Основы логирования в Yii2
В Yii2 логирование построено на компоненте log. Он собирает сообщения из разных источников и отправляет их в целевые хранилища — файлы, базы данных, email и так далее. По умолчанию в конфигурации уже есть базовые настройки, но они не всегда подходят для реальных проектов.
Давайте разберёмся, как это работает. В Yii2 есть несколько уровней логирования: trace, info, warning, error. Каждый уровень имеет своё значение:
| Уровень | Когда использовать |
|---|---|
| trace | Для детальной отладки, например, трассировки выполнения кода |
| info | Для обычной информации, например, о действиях пользователя |
| warning | Для предупреждений, которые не являются ошибками, но требуют внимания |
| error | Для критических ошибок, которые нужно исправить немедленно |
Чтобы записать сообщение в лог, вы можете использовать статический метод Yii::info(), Yii::error() и другие. Например:
// Запись информационного сообщения
Yii::info('Пользователь залогинился', 'auth');
// Запись ошибки
Yii::error('Не удалось сохранить заказ', 'order');
Второй параметр — это категория. Она помогает группировать сообщения. Например, все сообщения, связанные с авторизацией, можно отнести к категории auth, а с заказами — к order. Это удобно для фильтрации.
Настройка компонента log
Компонент log настраивается в файле конфигурации, обычно config/web.php или config/console.php. Вот типичный пример настройки:
'components' => [
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'logFile' => '@runtime/logs/app.log',
],
],
],
],
Здесь мы указываем, что хотим записывать ошибки и предупреждения в файл app.log. Но это только начало. Вы можете добавить несколько целей (targets), чтобы, например, ошибки отправлять на email, а всю информацию — в базу данных.
Важно понимать параметр traceLevel. Он определяет, сколько уровней стека вызовов будет записано в лог. Если вы включите его на время разработки, то сможете видеть, откуда именно вызвана ошибка. В продакшене лучше ставить 0, чтобы не нагружать систему.
Отладка с помощью Yii2 Debugger
Логирование — это отлично, но иногда нужно увидеть всю картину целиком. Для этого в Yii2 есть специальный инструмент — Debugger. Это панель, которая появляется внизу страницы (или в отдельном окне) и показывает массу полезной информации: запросы к базе, переменные окружения, время выполнения, конфигурацию и многое другое.
Debugger включается в конфигурации, обычно только для режима разработки. Вот пример:
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
'allowedIPs' => ['127.0.0.1', '::1'],
];
}
После этого вы сможете открывать панель, перейдя по адресу /debug на вашем сайте. Там вы найдёте вкладки:
- Logs — все записанные сообщения.
- DB — все SQL-запросы, с временем выполнения.
- Mail — отправленные письма.
- Configuration — текущая конфигурация приложения.
Debugger невероятно помогает при разработке, но будьте осторожны: не оставляйте его включённым на боевом сервере. Он раскрывает слишком много информации.
Продвинутые техники логирования
Когда базовые настройки освоены, можно перейти к более интересным вещам. Например, к отправке логов в сторонние сервисы, такие как Sentry или Papertrail. Это удобно, если у вас несколько серверов и вы хотите собирать логи в одном месте.
Для этого нужно создать свой класс цели (target). Например, для Sentry:
class SentryTarget extends \yii\log\Target
{
public function export()
{
foreach ($this->messages as $message) {
// Отправка сообщения в Sentry
\Sentry\captureMessage($message[0]);
}
}
}
Затем подключите его в конфигурации:
'log' => [
'targets' => [
[
'class' => 'app\components\SentryTarget',
'levels' => ['error', 'warning'],
],
],
],
Ещё одна полезная техника — логирование контекста. Например, вы можете добавить в лог информацию о текущем пользователе или запросе. Для этого можно переопределить метод getContextMessage() в своём классе target.
Как избежать типичных ошибок
При настройке логирования легко наступить на грабли. Вот несколько частых проблем и как их избежать:
- Забыли указать уровень — если не указать
levels, будут записываться все уровни, что может засорить лог. - Не настроили ротацию логов — файлы логов могут разрастись до гигантских размеров. Используйте ротацию, например, через logrotate.
- Записываете слишком много — не логируйте каждую мелочь. Это замедляет приложение и делает логи бесполезными.
- Не разделяете логи по категориям — лучше иметь отдельные файлы для разных компонентов, например, для БД и для пользовательских действий.
Yii::info('Заказ создан', 'order'). Потом вы сможете легко фильтровать логи по категории, даже если они в одном файле.
Что в итоге
Логирование и отладка — это не роскошь, а необходимость для любого серьёзного проекта. Настроив их правильно, вы сэкономите себе часы работы и нервы. Начните с базовой настройки, добавьте Debugger на время разработки, а потом, по мере роста проекта, подключайте внешние сервисы и продвинутые техники.
Главное — помните: логи должны быть информативными, но не избыточными. И всегда защищайте доступ к ним. Тогда ваше приложение будет под контролем, а вы — спокойны.


