十二面体/monolog-sticky-context

此软件包最新版本(1.1.0)没有可用的许可信息。

1.1.0 2021-04-07 15:02 UTC

This package is auto-updated.

Last update: 2024-09-07 22:09:02 UTC


README

Sticky Context Processor 是一个 Monolog 处理器,允许您配置应始终附加到您的日志消息的上下文数据(日志记录上的 extra 键)。

这类似于每次要将上下文数据附加到所有日志记录时,都向您的 Monolog 日志实例推送一个自定义处理器。使用自定义 Monolog 处理器,它看起来可能像这样

<?php

$logger = new Monolog\Logger('sticky');
$logger->pushProcessor(function ($record) {
    $record['extra']['user'] = user()->id ?? null;
});

然而,这有几个缺陷

  1. 为什么我们应记录一个不存在的 null 用户,如果我们不希望对公共路由进行用户记录,我们可能根本不希望记录用户
  2. 如果我们希望稍后条件性地添加数据,我们该怎么办?如果我们希望在验证用户之前不添加验证用户的 ID 呢?
  3. 当我们附加了数据时,如果我们想排除某个特定日志记录的上下文数据,我们该怎么办?

此软件包提供了一个简单的 Monolog 处理器,允许您存储 和更新 您的“粘性”上下文数据。使用我们的处理器,上面的代码片段将看起来像这样

<?php
// ...

$logger = new Monolog\Logger('sticky');
$logger->pushProcessor(new StickyContextProcessor);

StickyContext::add('user', user()->id ?? null);

安装

使用 composer 需求此软件包以进行安装

composer require decahedron/monolog-sticky-context

然后以下方式将 StickyContextProcessor 推送到您的 Monolog 实例

<?php
use Decahedron\StickyLogging\StickyContextProcessor;

$logger = new Monolog\Logger('sticky');
$logger->pushProcessor(new StickyContextProcessor);

Laravel 5.6+ 用户

如果您正在使用版本 5.6 或更高版本的 Laravel 框架,您可以在您的日志配置中使用我们的 tap

use Decahedron\StickyLogging\Laravel\UseStickyLogging;

return [
    ...
    
    'channels' => [
        'single' => [
            'driver' => 'single'
            'path'   => storage_path('logs/laravel.log'),
            'level'  => 'debug',
            'tap'    => [UseStickyLogging::class]
        ],
        
        ...
    ]
]

用法

之后,您只需关注与 StickyContext 对象的交互。

您可以通过调用 add 来添加新数据

if (auth()->check()) {
    StickyContext::add('user', user()->id)
}

// $logger->level(...) will now attach the sticky context data in `extra`

如果您出于某种原因想排除某些代码部分的粘性数据,您可以使用 enabledisable 方法

StickyContext::disable();
$logger->debug(...);
StickyContext::enable();

您也可以通过调用 flush 清除所有粘性上下文数据

StickyContext::add('user', 1);
$logger->info('Something happened');        // This will include the user id in the context
StickyContext::flush();

$logger->info('Something else happened');   // The sticky context is now empty and not included

如果您需要附加可能随时间变化的数据,并且因此需要回调来检索此数据,您可以将回调指定为第二个值

StickyContext::add('user', function () {
    return user()->id;
});

闭包将在处理器每次运行时进行评估。因此,数据不会在日志消息之间进行缓存。这意味着您可以在实例化时添加此粘性上下文数据(这对软件包可能很有用)。然而,由于它每次都会执行,因此它的性能略低于存储静态值。

堆栈

如果您需要将粘性数据分离到 Monolog 的 extra 数组中的多个不同键,您可以使用堆栈。堆栈保存一组粘性数据,您可以使用多个堆栈来分离数据。

一个可能的用例是您有(内部)软件包,它们将粘性数据添加到日志中。在这种情况下,您可能希望区分软件包设置的粘性数据和应用程序设置的粘性数据。通过使软件包将其日志记录到自己的堆栈,数据将出现在记录的 extra 数组中指定的键下。

示例

// Somewhere in the package
StickyContext::stack('my_package')->add('request_id', Uuid::uuid4()->toString());

// In the application
StickyContext::add('user', user()->id);

这将向my_package堆栈推送新的粘性数据。当消息被记录时,您的日志消息的extra键将如下所示

[
    'sticky' => [
        'user' => 1,
    ],
 
    'my_package' => [
        'request_id' => '91c9dc1e-11ed-46ff-8598-701a9f93eb2b',
    ],
]

默认堆栈

堆栈是用于存储上下文数据的底层对象。当您调用StickyContext::add()时,实际上是通过代理调用到StickyContext::stack('sticky')->add()。这被称为默认堆栈。您可以通过调用StickyContext::defaultStack()来更改默认堆栈。

StickyContext::defaultStack('application');

现在,当添加上下文数据并发送日志消息时,粘性数据将被添加到['extra']['application']下,而不是默认的['extra']['sticky']

请注意,当更改默认堆栈时,您之前添加的任何粘性数据都将被保留,只是移动到新的堆栈名称。