Пакет · logger

Установка и требования

Winter Logger ставится через Composer. Вывод логов зависит от одного опционального пакета — Monolog, — и библиотека спроектирована так, чтобы одинаково хорошо работать с ним и без него.

Системные требования

  • Версия PHP — 8.3 или выше.
  • psr/log ^3.0 — интерфейсы PSR-3 (ставятся автоматически).
  • monolog/monolog ^3.5рекомендуется. Нужен для любого реального вывода логов.
  • ext-swoole (или ext-openswoole) — опционально. Требуется только для CoroutineContext под Swoole.

Установка

С Monolog — обычная конфигурация, даёт реальный вывод логов:

bash
composer require flytachi/winter-logger monolog/monolog

Без Monolog — каждый логгер становится молчаливым NullLogger:

bash
composer require flytachi/winter-logger

Почему Monolog опционален

Monolog объявлен в composer.json в секции suggest, поэтому Composer никогда не ставит его автоматически. Потребители могут полностью отказаться от логирования — без единой правки кода.

Опциональные зависимости

Пакет Назначение
monolog/monolog ^3.5 Нужен для реального вывода логов. Без него логгеры — no-op.
ext-swoole Контекст, локальный для корутины, в Swoole (CoroutineContext).
ext-openswoole Альтернатива ext-swoole.

Режим без Monolog

Когда monolog/monolog не установлен, LoggerManager::channel() возвращает Psr\Log\NullLogger для каждого канала. Ни исключений, ни предупреждений — код просто выполняется молча. Это полезно для:

  • Библиотек, которые поддерживают логирование опционально.
  • Микросервисов, где логирование включается/выключается по окружению.
  • Тестов, где вывод логов не важен.

Полное обоснование — и точный путь в коде — в Глубоком погружении → Monolog опционален.

Интеграция с фреймворком

Библиотека никогда не трогает getenv(), $_ENV или любое определение инфраструктуры. В winter-kernel фреймворк читает env-переменные, определяет цель вывода (stdout / stderr / syslog / file), выбирает подходящий ContextStorage под рантайм (FPM / Swoole / CLI) и передаёт готовый конфиг в LoggerManager.

Как связать это самому — см. Интеграцию с фреймворком.

Дальше