opxcore / log-manager
OpxCore日志管理器。
Requires
- php: ^7.4
- opxcore/container: ^1.0.3
- opxcore/log-interface: ^1.0.8
- opxcore/log-manager-interface: ^1.0.0
Requires (Dev)
- phpunit/phpunit: ^9.5.0
README
日志管理器是一个处理多个日志记录器的包。所有写入(发送或其他)逻辑和信息格式化都必须在这些日志记录器中实现。日志管理器只负责解决哪个日志记录器将被使用,并为相应的日志记录器触发日志操作。
每个日志记录器都必须实现Psr\Log\LoggerInterface。
安装
composer require opxcore/log-manager
基本创建
use OpxCore\Log\LogManager; $manager = new LogManager($default, $loggers, $groups);
使用 container 创建
use OpxCore\Interfaces\LoggerInterface; use OpxCore\Log\LogManager; $container->bind( LoggerInterface::class, LogManager::class, [ 'default' => $default, 'loggers' => $loggers, 'groups' => $groups, ] ); $manager = $container->make(LoggerInterface::class);
或
$container->bind(LoggerInterface::class, LogManager::class); $manager = $container->make(LoggerInterface::class, [ 'default' => $default, 'loggers' => $loggers, 'groups' => $groups, ]);
配置和使用
配置数组包含三个键。值 'default' 必须包含一个(或多个)要作为默认日志记录器使用的日志记录器名称(或名称数组)。 'loggers' 是一个由名称键控的日志记录器集,要使用的每个日志记录器的必需参数是包含对应名称所使用的日志记录器类名的 'driver'(请参阅下面的示例)。第三个附加键 'groups' 包含由组名称键控的日志记录器组数组。
日志管理器扩展了 container,因此日志记录器将通过它解析,包括所有依赖注入。所有日志记录器将在需要时解析并实例化以供将来使用。所有参数(除 'driver' 之外)都将作为参数传递给日志记录器构造函数。
此外,您还可以绑定自定义创建的日志记录器
$manager->bind('custom_logger', function() { return new Logger(...); });
要获取某个特定的日志记录器,请调用方法 $manager->logger($name),其中 $name 是要返回的日志记录器的名称。如果提供 null,则将使用默认日志记录器(或多个日志记录器)。
要获取多个日志记录器,请使用相同的方法,并传递一个包含名称的数组 $manager->logger([$name1, $name2])
在两种情况下,都将返回带有所选日志记录器绑定的 LoggerProxy 类,因此 $manager->logger([$name1, $name2])->log($message) 将在每个日志记录器上调用日志操作。
要使用分组日志,请使用 $manager->group($group) 或 $manager->group([$group1, $group2])。每个组将被解析为日志记录器集合,然后合并在一起,去除重复项。
PSR-3
日志管理器实现了PSR-3。因此可用的方法是
$manager->emergency($message, $context); $manager->alert($message, $context); $manager->critical($message, $context); $manager->error($message, $context); $manager->warning($message, $context); $manager->notice($message, $context); $manager->info($message, $context); $manager->debug($message, $context); $manager->log($level, $message, $context);
这些方法将调用默认日志记录器(们)的相应方法。
示例
日志管理器配置
$default = 'file'; // Also you can use 'default' => ['file', 'null'], $loggers = [ 'file' => [ 'driver' => \OpxCore\Log\LogFile::class, 'filename' => '/www/project/logs', ], 'null' => [ 'driver' => \OpxCore\Log\LogNull::class, ] ]; $groups = [ 'local' => ['file', 'null'], 'network' => ['email'], ];
日志记录器类
namespace \OpxCore\Log; class LogFile implements \Psr\Log\LoggerInterface { protected string $filename; public function __construct(string $filename) { $this->filename = $filename; } ... }
首次调用 $manager->logger('file') 将创建并返回 LogFile 类实例(对于此示例等于 new \OpxCore\Log\LogFile('/www/project/logs'))并将其实例存储供将来使用。因此,第二次调用 $manager->logger('file') 将返回相同的日志记录器实例。
对于此示例使用
$manager->logger('file')->debug('Some message');
等于(因为已将 'file' 设置为默认日志记录器)
$manager->logger()->debug('Some message');
等于
$manager->debug('Some message');