Добавление каналов в рантайме
Канал — это именованный экземпляр Monolog со своим уровнем, форматом и выводом. Помимо каналов, переданных при конструировании, можно регистрировать новые в рантайме — например, для воркера задач, которому нужен собственный ротируемый файл.
Добавить канал через фабрику
Как только отработал LoggerFactory::setManager(),
addChannel() регистрирует дополнительный канал на текущем менеджере:
use Monolog\Level;
use Flytachi\Winter\Logger\LoggerFactory;
LoggerFactory::addChannel('job', [
'level' => Level::Debug,
'format' => 'line',
'output' => 'file',
'file_path' => '/var/log/app/job.log',
'file_max' => 7,
'syslog_ident' => 'winter',
]);
// Теперь адресуйте его явно:
LoggerFactory::getLogger('App\\Job\\ReportJob', 'job')->debug('step done');output=file требует file_path
Когда output равен 'file', file_path обязателен — это абсолютный путь к файлу лога.
Обработчик ротирует его ежедневно и хранит file_max файлов. Пропуск бросает
InvalidArgumentException. См. Конфиг канала.
Добавить канал прямо на менеджере
Если у вас есть ссылка на LoggerManager, withChannel() возвращает новый менеджер с
добавленным каналом — исходный не меняется (менеджер иммутабелен на уровне конфига):
$manager = $manager->withChannel('job', [
'level' => Level::Debug,
'format' => 'line',
'output' => 'file',
'file_path' => '/var/log/app/job.log',
'file_max' => 7,
'syslog_ident' => 'winter',
]);addChannel() на фабрике — тонкая обёртка: он вызывает withChannel(), сохраняет новый
менеджер обратно, а затем очищает поклассовый кэш.
Проверить, существует ли канал
if ($manager->hasChannel('job')) {
// ...
}Фолбэк на неизвестный канал
Попросите у getLogger() канал, который не зарегистрирован, — и он молча откатится к
текущему каналу по умолчанию, без исключения:
// 'job' не зарегистрирован → используется канал по умолчанию:
LoggerFactory::getLogger(self::class, 'job')->info('...');channel() не откатывается
LoggerFactory::channel('job') — сырой
доступ к каналу — бросает InvalidArgumentException для незарегистрированного канала.
Только getLogger() мягко вырождается к каналу по умолчанию.
Сбросить кэш каналов
В долгоживущем воркере, который перечитывает конфиг, flush() сбрасывает все построенные
экземпляры Monolog, так что они пересоберутся из текущего конфига при следующем использовании:
$manager->flush(); // закэшированные каналы сброшены; пересоберутся лениво при следующем channel()Связанное
- Справочник конфига канала — каждый ключ и цель вывода
- Интеграция с фреймворком — порядок бутстрапа
- Справочник API → LoggerManager