Пакет · logger

Добавление каналов в рантайме

Канал — это именованный экземпляр Monolog со своим уровнем, форматом и выводом. Помимо каналов, переданных при конструировании, можно регистрировать новые в рантайме — например, для воркера задач, которому нужен собственный ротируемый файл.

Добавить канал через фабрику

Как только отработал LoggerFactory::setManager(), addChannel() регистрирует дополнительный канал на текущем менеджере:

php
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() возвращает новый менеджер с добавленным каналом — исходный не меняется (менеджер иммутабелен на уровне конфига):

php
$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(), сохраняет новый менеджер обратно, а затем очищает поклассовый кэш.

Проверить, существует ли канал

php
if ($manager->hasChannel('job')) {
  // ...
}

Фолбэк на неизвестный канал

Попросите у getLogger() канал, который не зарегистрирован, — и он молча откатится к текущему каналу по умолчанию, без исключения:

php
// 'job' не зарегистрирован → используется канал по умолчанию:
LoggerFactory::getLogger(self::class, 'job')->info('...');

channel() не откатывается

LoggerFactory::channel('job') — сырой доступ к каналу — бросает InvalidArgumentException для незарегистрированного канала. Только getLogger() мягко вырождается к каналу по умолчанию.

Сбросить кэш каналов

В долгоживущем воркере, который перечитывает конфиг, flush() сбрасывает все построенные экземпляры Monolog, так что они пересоберутся из текущего конфига при следующем использовании:

php
$manager->flush();   // закэшированные каналы сброшены; пересоберутся лениво при следующем channel()

Связанное