fi1a / log
PHP библиотека ведения журнала (логирования)
Requires
- php: ^7.3 || ^8
- ext-json: *
- fi1a/dependency-injection: ^1.0
- fi1a/format: ^2.1
Requires (Dev)
- captainhook/captainhook: ^5.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
This package is auto-updated.
Last update: 2024-12-22 06:32:03 UTC
README
Данный пакет предоставляет функционал ведения журнала (логирования), используя обработчики. На данный момент доступны обработчики записи в файл, syslog и отправка записей на email адрес. Наличие "каналов" позволяет вести журнал, отправляя записи в разные обработчики с разными настройками. Один канал может содержать множество обработчиков записей журнала. Сообщения журнала могут быть записаны в разные обработчики в зависимости от их серьезности (уровня).
Установка
Установить этот пакет можно как зависимость, используя Composer.
composer require fi1a/log
Хелпер
В пакете доступен хелпер:
logger(?string $channel = null): ChannelsInterface|LoggerInterface|false;
Он возвращает каналы логгера.
Используя канал логирования channel1
, записать в лог критическую ошибку:
logger('channel1')->critical('Critical error with {{value}}', ['value' => 'message',], ['id' => 1]);
Конфигурирование
Конфигурирование канала осуществляется путем добавления экземпляра класса Fi1a\Log\Logger
, используя метод
addChannel
класса Fi1a\Log\ChannelsInterface
возвращаемого хелпером logger
без передачи аргументов.
Обработчики добавляются методом addHandler
класса Fi1a\Log\Logger
. В примере добавляются обработчики
для записи в файл журнала Fi1a\Log\Handlers\StreamHandler
записей с уровнем Fi1a\Log\LevelInterface::ERROR
и
отправку на email записей с уровнем Fi1a\Log\LevelInterface::EMERGENCY
с помощью обработчика
Fi1a\Log\Handlers\MailHandler
.
use Fi1a\Log\Handlers\MailHandler; use Fi1a\Log\Handlers\StreamHandler; use Fi1a\Log\LevelInterface; use Fi1a\Log\Logger; $logger = new Logger('channel1'); $logger->addHandler(new StreamHandler(__DIR__ . '/filelog.log', LevelInterface::ERROR)); $logger->addHandler(new MailHandler('to@fi1a.ru', 'from@fila.ru', LevelInterface::EMERGENCY)); logger()->addChannel($logger);
Доступные обработчики
Fi1a\Log\Handlers\StreamHandler
- обработчик логирования в файл (поток);Fi1a\Log\Handlers\RotatingFileHandler
- сохраняет логи в файлах с именем по маске времени. Хранится ограниченное кол-во файлов;Fi1a\Log\Handlers\SyslogHandler
- логирование в syslog;Fi1a\Log\Handlers\MailHandler
- отправка логов на почту.
Fi1a\Log\Handlers\StreamHandler
Сохранение записей журнала в файл или поток.
use Fi1a\Log\Handlers\StreamHandler; $handler = new StreamHandler(__DIR__ . '/filelog.log', LevelInterface::ERROR); $logger->addHandler($handler);
Fi1a\Log\Handlers\RotatingFileHandler
Сохранение записей журнала в файлах с именем по маске времени. Хранится ограниченное кол-во файлов.
use Fi1a\Log\Handlers\RotatingFileHandler; $handler = new RotatingFileHandler(__DIR__ . '/filelog.log', 2, 'Y-m-d', LevelInterface::ERROR); $logger->addHandler($handler);
Fi1a\Log\Handlers\SyslogHandler
Сохранение записей журнала, используя syslog.
use Fi1a\Log\Handlers\SyslogHandler; $handler = new SyslogHandler('error', LOG_USER, LevelInterface::ERROR); $logger->addHandler($handler);
Fi1a\Log\Handlers\MailHandler
Отправка записей журнала на почту.
use Fi1a\Log\Handlers\MailHandler; $handler = new MailHandler('to@fi1a.ru', 'from@fila.ru', LevelInterface::ERROR); $logger->addHandler($handler);
Запись сообщений журнала
Вы можете записывать информацию в журнал с помощью канала возвращаемого хелпером logger
,
который при передаче аргумента с названием канала возвращает его.
Средство ведения журнала обеспечивает восемь уровней: emergency, alert, critical, error, warning, notice, info, и debug.
Для каждого уровня есть свой метод записи в журнал:
$logger = logger('channel1'); $logger->emergency('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->alert('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->critical('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->warning('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->notice('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->info('Log {{value}}', ['value' => 'message'], ['id' => 1]); $logger->debug('Log {{value}}', ['value' => 'message'], ['id' => 1]);
emergency
- система не работает;alert
- ошибка. Необходимо принять меры немедленно.critical
- критическая ошибка;error
- ошибка, которая не требует немедленных действий, но должна быть записана;warning
- предупреждение;notice
- все нормально, но событие значимое;info
- какое-либо событие;debug
- отладочная информация.
Также доступен метод log
для записи в журнал с передачей уровня логирования в аргументе:
$logger = logger('channel1'); $logger->log(LevelInterface::ERROR, 'Log {{value}}', ['value' => 'message'], ['id' => 1]);
Контекстная информация
Методом withContext
класса Fi1a\Log\Logger
(для этого канала), или класса Fi1a\Log\Channels
(для всех каналов)
может быть передан массив контекстных данных, которые будут включены во все последующие записи журнала.
Также контекстные данные можно передать третьим аргументом любого из методов записи в журнал,
эти контектсные данные будут использованы только к этой записи.
// Глобально для всех каналов logger()->withContext(['pid' => 1]); // Для конкретного канала $logger = logger('channel1'); $logger->withContext(['uid' => 2]); // Для конкретной записи $logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]); /* 14.01.2023 10:18:58 channel1.ERROR[500] Log message {"pid":1,"uid":2,"id":1} */
Форматирование
Доступны следующие классы для форматирования сообщений журнала:
Fi1a\Log\Formatters\TextFormatter
- форматирование записи лога в текст;Fi1a\Log\Formatters\HtmlFormatter
- форматирование записи лога в виде html.
Каждому обработчику можно передать объект форматирование записи журнала в конструктор.
use Fi1a\Log\Formatters\HtmlFormatter; use Fi1a\Log\Handlers\StreamHandler; use Fi1a\Log\LevelInterface; $formatter = new HtmlFormatter(); $logger->addHandler( new StreamHandler( __DIR__ . '/log.html', LevelInterface::DEBUG, 0776, false, $formatter ) ); logger()->addChannel($logger); $logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]);