Пакет · logger

Конфиг канала

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

Форма конфига

php
'http' => [
  'level'        => \Monolog\Level::Info,
  'format'       => 'line',
  'output'       => 'stderr',
  'file_path'    => null,
  'file_max'     => 30,
  'syslog_ident' => 'winter',
],
Ключ Тип Обязателен По умолчанию Описание
level Monolog\Level да Минимальный уровень; записи ниже отбрасываются.
format 'line' | 'json' да Формат вывода. См. ниже.
output см. цели да Куда пишутся записи.
file_path string|null когда output=file null Абсолютный путь к файлу лога.
file_max int нет 30 Максимум ротируемых файлов для хранения.
syslog_ident string нет 'winter' Идентификатор процесса в syslog.

Конфиг передаётся, а не выводится

Библиотека никогда не выводит эти значения из окружения. Фреймворк строит конфиг и передаёт его в LoggerManager. См. Интеграцию с фреймворком.

Цели вывода

Значение output выбирает обработчик Monolog (строится HandlerFactory):

output Обработчик Заметки
stdout SafeStreamHandler('php://stdout') Swoole, CLI.
stderr SafeStreamHandler('php://stderr') FPM — безопасен от broken pipe.
syslog SyslogHandler Централизованное логирование Docker / Kubernetes. Facility LOG_USER.
file RotatingFileHandler Требует file_path; ротация ежедневная (Y-m-d), хранит file_max файлов, использует блокировку.
null NullHandler Отбрасывает всё — полезно в тестах.

Неизвестный output или output=file без file_path бросают InvalidArgumentException.

FPM + stdout = риск broken pipe

Под PHP-FPM php://stdout — это поток ответа FastCGI к nginx/Apache. Если клиент отключился, запись в него может послать SIGPIPE воркеру. Используйте stderr для FPM — он идёт в error_log FPM, независимо от клиента. Полное объяснение: Вывод и broken pipe.

Форматы

Выбираются по format (строятся FormatterFactory):

format Форматтер Использование
line SpringLineFormatter Читаемая одна строка — терминалы, разработка, слежение за логами.
json JsonFormatter из Monolog JSON с разделением по строкам — Loki, Elasticsearch, Datadog.

Точная анатомия строки и метки уровней — в Формате логов.

Syslog и завершающие переводы строк

Когда output равен syslog, менеджер строит форматтер с appendNewline = false — syslog сам обрамляет каждое сообщение, поэтому лишний завершающий перевод строки породил бы ложную пустую запись. Для любого другого вывода форматтер добавляет \n. Это делается автоматически; настраивать не нужно.

Пример — несколько каналов

php
use Monolog\Level;

$channels = [
  'sys'  => ['level' => Level::Warning, 'format' => 'line', 'output' => 'stderr',
             'file_path' => null, 'file_max' => 30, 'syslog_ident' => 'winter'],
  'http' => ['level' => Level::Info,    'format' => 'json', 'output' => 'syslog',
             'file_path' => null, 'file_max' => 30, 'syslog_ident' => 'winter'],
  'job'  => ['level' => Level::Debug,   'format' => 'line', 'output' => 'file',
             'file_path' => '/var/log/app/job.log', 'file_max' => 7, 'syslog_ident' => 'winter'],
];

Связанное