harbor / monolog-manager
管理多个 Monolog 日志记录器
Requires
- php: ^7.4 || ^8.0
- monolog/monolog: ^2.2
- nikolaposa/monolog-factory: ^3.1
- psr/container: ^1.0
- psr/log: ^1.1
Requires (Dev)
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
README
Monolog Manager 允许您轻松创建和使用多个日志通道。该管理器利用 Monolog Factory,通过配置轻松创建日志记录器。
您可以选择使用 PSR-11 依赖注入容器来在您的日志配置中解决处理器、处理程序和格式化程序的依赖关系。
安装
推荐的安装方法是使用 Composer。运行以下命令以安装软件包的最新版本并将其添加到您的项目的 composer.json
文件中:
composer require harbor/monolog-manager
用法
添加日志通道
use Monolog\Formatter\HtmlFormatter; use Monolog\Formatter\LineFormatter; use Monolog\Handler\NativeMailerHandler; use Monolog\Handler\StreamHandler; use Monolog\Processor\PsrLogMessageProcessor; use Psr\Log\LogLevel; $manager = new Harbor\MonologManager\Manager(); // Setup the default logger $manager->add('app', [ 'default' => true, 'handlers' => [ 'name' => StreamHandler::class, 'params' => [ 'stream' => 'path/to/your.log', 'level' => LogLevel::WARNING, ], 'formatter' => [ 'name' => LineFormatter::class, 'params' => [ 'allowInlineLineBreaks' => false, 'ignoreEmptyContextAndExtra' => true, ], ], ], 'processors' => [ [ 'name' => PsrLogMessageProcessor::class, ] ], ]); // Add an additional logging channel $manager->add('alert', [ 'handlers' => [ [ 'name' => NativeMailerHandler::class, 'params' => [ 'to' => 'alerts@example.com', 'subject' => 'Application Alert', 'from' => 'noreply@example.com', 'level' => Logger::ALERT, ], 'formatter' => [ 'name' => HtmlFormatter::class, ], ], ], 'processors' => [ [ 'name' => PsrLogMessageProcessor::class, ] ], ]);
将日志记录到默认通道
Manager
实现了 Psr\Log\LoggerInterface
,并将日志消息发送到默认通道。
// These logs be sent to the `app` channel we configured above. $manager->emergency('test emergency'); $manager->alert('test alert'); $manager->critical('test critical'); $manager->error('test error'); $manager->warning('test warning'); $manager->notice('test notice'); $manager->info('test info'); $manager->debug('test debug'); $manager->log(LogLevel::INFO, 'test log');
此外,您还可以在默认通道的 Mongolog\Logger
实例上调用任何方法
$manager->getName(); // returns "app"
将日志记录到特定通道
使用 Manager
上的 channel(?string $name = null)
方法,您可以获取该通道的 Mongolog\Logger
实例
/** @var \Mongolog\Logger */ $logger = $manager->channel('alert'); $logger->alert('Something important happened!');
紧急日志记录器
默认情况下,如果创建日志记录器实例时发生错误,则 Manager
将返回默认的“紧急日志记录器”。
这是为了防止日志配置/使用问题停止脚本执行。
默认紧急日志记录器通过以下方式添加:
$manager->add(Manager::EMERGENCY_CHANNEL, [ 'handlers' => [ [ 'name' => \Monolog\Handler\StreamHandler::class, 'params' => [ 'stream' => 'php://stderr', 'level' => \Psr\Log\LogLevel::DEBUG, ], ], ], ]);
提供您自己的紧急日志记录器
只需添加一个通道,使用 Manager::EMERGENCY_CHANNEL
作为通道名称。
禁用紧急日志记录器
$manager->useEmergencyChannel(false);
使用依赖注入容器
使用 PSR-11 容器解决依赖关系
设置
use Harbor\MonologManager\Factory; use Harbor\MonologManager\Manager; use Psr\Container\ContainerInterface; /** @var ContainerInterface */ $container = getContainer(); // Create a new Factory, providing the container $factory = new Factory($container); // Provide your factory to the Manager $manager = new Manager($factory);
在通道配置中使用容器
使用以下逻辑解决 handlers
、processors
和 formatter
:
注意:术语 callable
指的是任何 is_callable($value) === true
的值 或 任何具有 method_exists($value, '__invoke')
方法的类。
- 如果值是正确类型的对象:
$value = $value
- 如果值是字符串,并且
$container->has($value)
:$value = $container->get($value)
- 如果值是字符串,并且是可调用的:
$value = $value($container)
- 如果值是数组,并且
isset($value['formatter'])
:$value['formatter'] = $this->resolve($value['formatter'])
如果值无法解决,则抛出 InvalidArgumentException
异常(默认情况下发送到紧急日志记录器,见上文)
所有可能值的示例
$manager->add('useless-logger', [ 'handlers' => [ HandlerFactory::class, NoopHandler::class, new NoopHandler(), static fn () => new NoopHandler(), [ 'name' => ErrorLogHandler::class, 'formatter' => LineFormatter::class, ], [ 'name' => ErrorLogHandler::class, 'formatter' => new LineFormatter(), ], ], 'processors' => [ PsrLogMessageProcessor::class, new MemoryUsageProcessor(), ], ]);
许可证
在 MIT 许可证下发布