Когда ваше приложение начинает жить своей жизнью, рано или поздно наступает момент, когда оно делает что-то неожиданное. Ошибки, медленные запросы, странные баги — всё это часть разработки. Но как понять, что происходит под капотом? Ответ прост: логирование и отладка. В этой статье я расскажу, как настроить их в Yii2 так, чтобы вы тратили меньше времени на поиск проблем и больше — на их решение.

Digital-студия WNDER

Почему логирование — это важно

Представьте, что ваше приложение — это автомобиль. Логи — это приборная панель. Без неё вы едете вслепую: не знаете, сколько топлива осталось, не видите, что двигатель перегревается. В разработке логи — это та самая панель, которая показывает, что происходит внутри системы. Они помогают:

  • Находить ошибки, которые невозможно воспроизвести вручную.
  • Отслеживать медленные запросы и узкие места.
  • Понимать поведение пользователей и системы.
  • Анализировать инциденты после их возникновения.

Без настроенного логирования вы будете гадать, почему что-то сломалось, вместо того чтобы просто посмотреть в файл. А это потерянное время, нервы и деньги.

Основы логирования в 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, чтобы не нагружать систему.

Правило: Никогда не включайте полный traceLevel на продакшене. Это замедляет работу и может раскрыть внутреннюю структуру кода злоумышленникам.

Отладка с помощью 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 на время разработки, а потом, по мере роста проекта, подключайте внешние сервисы и продвинутые техники.

Главное — помните: логи должны быть информативными, но не избыточными. И всегда защищайте доступ к ним. Тогда ваше приложение будет под контролем, а вы — спокойны.

Студия WNDER