Пакет предоставляет PSR-3-совместимую библиотеку логирования. Активно используется в Yii Framework, но может работать и как отдельный пакет.
Логгер отправляет сообщения в один или несколько таргетов. Каждый таргет может фильтровать сообщения по уровню и категории, а затем экспортировать их в нужное хранилище - файл, email, syslog и т.д.
- PHP 8.0 или выше.
composer require yiisoft/logСоздание логгера:
/**
* Список экземпляров классов, наследующих \Yiisoft\Log\Target.
*
* @var \Yiisoft\Log\Target[] $targets
*/
$logger = new \Yiisoft\Log\Logger($targets);Запись логов:
$logger->emergency('Emergency message', ['key' => 'value']);
$logger->alert('Alert message', ['key' => 'value']);
$logger->critical('Critical message', ['key' => 'value']);
$logger->warning('Warning message', ['key' => 'value']);
$logger->notice('Notice message', ['key' => 'value']);
$logger->info('Info message', ['key' => 'value']);
$logger->debug('Debug message', ['key' => 'value']);Логгер совместим с PSR-3 и поддерживает плейсхолдеры в сообщениях. Плейсхолдеры в строке сообщения заменяются значениями из массива контекста:
$logger->info('User {username} logged in from {ip}', [
'username' => 'john_doe',
'ip' => '192.168.1.1',
]);
// Запишет: "User john_doe logged in from 192.168.1.1"Имена плейсхолдеров заключаются в фигурные скобки {placeholder} и должны соответствовать ключам массива контекста.
Как расширение спецификации PSR-3 логгер поддерживает доступ к вложенным значениям массива через точечную нотацию:
$logger->info('User {user.name} with ID {user.id} performed action', [
'user' => [
'id' => 123,
'name' => 'John Doe',
],
]);
// Запишет: "User John Doe with ID 123 performed action"В плейсхолдерах можно использовать разные типы данных:
- Строки и числа - выводятся как есть
null- выводится как пустая строка- Stringable-объекты - конвертируются через
__toString() - Массивы и объекты - форматируются через VarDumper
$logger->warning('Failed to process order {order_id}', [
'order_id' => 12345,
]);
$logger->error('Invalid data: {data}', [
'data' => ['key' => 'value'],
]);Массив контекста сохраняется в сообщении и может использоваться таргетами для фильтрации, форматирования и экспорта. Это позволяет передавать структурированные данные вместе с текстовым сообщением:
$logger->info('Payment processed', [
'amount' => 99.99,
'currency' => 'USD',
'transaction_id' => 'txn_123456',
'user_id' => 42,
]);Лог-сообщения накапливаются в памяти. Чтобы ограничить потребление памяти, логгер сбрасывает
накопленные сообщения в таргеты при достижении определённого количества.
Это количество настраивается через \Yiisoft\Log\Logger::setFlushInterval():
$logger->setFlushInterval(100); // по умолчанию 1000Каждый таргет тоже накапливает сообщения в памяти. Экспорт работает по тому же принципу.
Количество сообщений перед экспортом настраивается через \Yiisoft\Log\Target::setExportInterval():
$target->setExportInterval(100); // по умолчанию 1000Примечание: сброс и экспорт всех сообщений также происходит при завершении приложения.
В пакете есть два встроенных таргета:
Yiisoft\Log\PsrTarget- передаёт сообщения в другой PSR-3-совместимый логгер.Yiisoft\Log\StreamTarget- записывает сообщения в указанный поток вывода.
Дополнительные таргеты реализованы в отдельных пакетах:
Провайдеры контекста добавляют дополнительные данные к каждому лог-сообщению. Провайдер передаётся
в конструктор Logger:
$logger = new \Yiisoft\Log\Logger(contextProvider: $myContextProvider);Доступны следующие провайдеры:
SystemContextProvider- добавляет системную информацию (время, потребление памяти, трейс, категорию по умолчанию);CommonContextProvider- добавляет произвольные общие данные;CompositeContextProvider- объединяет несколько провайдеров в один.
По умолчанию логгер использует SystemContextProvider.
SystemContextProvider добавляет в контекст:
time- текущий Unix timestamp с микросекундами (float);trace- массив информации о стеке вызовов;memory- использование памяти в байтах;category- категория сообщения (по умолчанию "application").
Параметры конструктора Yiisoft\Log\ContextProvider\SystemContextProvider:
traceLevel- сколько уровней стека вызовов логировать для каждого сообщения. Если больше 0, будет залогировано не более указанного количества вызовов. Учитываются только вызовы из кода приложения.excludedTracePaths- массив путей, исключаемых из трейса.
Пример:
$logger = new \Yiisoft\Log\Logger(
contextProvider: new Yiisoft\Log\ContextProvider\SystemContextProvider(
traceLevel: 3,
excludedTracePaths: [
'/vendor/yiisoft/di',
],
),
);CommonContextProvider позволяет добавить произвольные данные в контекст каждого сообщения:
$logger = new \Yiisoft\Log\Logger(
contextProvider: new Yiisoft\Log\ContextProvider\CommonContextProvider([
'environment' => 'production',
]),
);CompositeContextProvider объединяет несколько провайдеров:
$logger = new \Yiisoft\Log\Logger(
contextProvider: new Yiisoft\Log\ContextProvider\CompositeContextProvider(
new Yiisoft\Log\ContextProvider\SystemContextProvider(),
new Yiisoft\Log\ContextProvider\CommonContextProvider(['environment' => 'production'])
),
);В приложении Yii3 Psr\Log\LoggerInterface резолвится через DI-контейнер.
Чтобы использовать Yiisoft\Log\Logger как реализацию, добавьте привязку в DI-конфиг приложения
(например config/common/di/logger.php):
use Psr\Log\LoggerInterface;
use Yiisoft\Definitions\ReferencesArray;
use Yiisoft\Log\Logger;
use Yiisoft\Log\StreamTarget;
use Yiisoft\Log\Target\File\FileTarget;
return [
LoggerInterface::class => [
'class' => Logger::class,
'__construct()' => [
'targets' => ReferencesArray::from([
FileTarget::class,
StreamTarget::class,
]),
],
],
];Каждый таргет в ReferencesArray::from() резолвится DI-контейнером как отдельный сервис.
Пакеты таргетов вроде yiisoft/log-target-file поставляют
свои di.php и params.php, которые автоматически мержатся
плагином конфигурации, поэтому FileTarget работает из коробки
с настройками по умолчанию (пишет в @runtime/logs/app.log с ротацией). StreamTarget из этого пакета
пишет в php://stdout по умолчанию и не требует дополнительной настройки.
Чтобы использовать только StreamTarget без пакета файлового таргета:
use Psr\Log\LoggerInterface;
use Yiisoft\Definitions\ReferencesArray;
use Yiisoft\Log\Logger;
use Yiisoft\Log\StreamTarget;
return [
LoggerInterface::class => [
'class' => Logger::class,
'__construct()' => [
'targets' => ReferencesArray::from([
StreamTarget::class,
]),
],
],
];При использовании плагина конфигурации event-конфиги загружаются автоматически.
Пакет предоставляет файлы events-web.php и events-console.php с обработчиками для сброса логов
после отправки HTTP-ответа и при завершении консольной команды.