harbor/monolog-manager

管理多个 Monolog 日志记录器

1.0.2 2021-01-27 03:56 UTC

This package is auto-updated.

Last update: 2024-08-27 11:26:18 UTC


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);

在通道配置中使用容器

使用以下逻辑解决 handlersprocessorsformatter

注意:术语 callable 指的是任何 is_callable($value) === true 的值 任何具有 method_exists($value, '__invoke') 方法的类。

  1. 如果值是正确类型的对象:$value = $value
  2. 如果值是字符串,并且 $container->has($value)$value = $container->get($value)
  3. 如果值是字符串,并且是可调用的:$value = $value($container)
  4. 如果值是数组,并且 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 许可证下发布