十二面体 / monolog-sticky-context
Requires
- monolog/monolog: ^1.0|^2.0
Requires (Dev)
- phpunit/phpunit: ^6.0|^7.0|^8.0
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; });
然而,这有几个缺陷
- 为什么我们应记录一个不存在的
null
用户,如果我们不希望对公共路由进行用户记录,我们可能根本不希望记录用户 - 如果我们希望稍后条件性地添加数据,我们该怎么办?如果我们希望在验证用户之前不添加验证用户的 ID 呢?
- 当我们附加了数据时,如果我们想排除某个特定日志记录的上下文数据,我们该怎么办?
此软件包提供了一个简单的 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`
如果您出于某种原因想排除某些代码部分的粘性数据,您可以使用 enable
和 disable
方法
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']
。
请注意,当更改默认堆栈时,您之前添加的任何粘性数据都将被保留,只是移动到新的堆栈名称。