touhidurabir / laravel-request-response-logger
一个PHP Laravel包,以优雅的方式结合队列和Redis,在数据库中记录应用程序的请求/响应
Requires
- php: >=7.4
- illuminate/support: ^8.67
- touhidurabir/laravel-model-uuid: ^1.0
Requires (Dev)
- orchestra/testbench: ^6.22
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-08-26 18:12:03 UTC
README
一个PHP Laravel包,以优雅的方式结合队列和Redis,在数据库中记录应用程序的请求/响应。
为什么?
人们首先会问的一个问题是“为什么?”可能有很多这样的包。而且,对于任何人来说,将其实现到他们的应用程序中也不是一件很难的事。我同意这一点。
然而,这个包旨在解决一个关键问题,即持续的数据库写入。通过结合Laravel出色的队列系统和Redis列表存储,它可以处理将每个日志数据放入Redis的情况,然后只有当达到一定限制时,才会将这些数据批量移动到数据库表,从而减少写操作。这个包执行日志记录操作不需要Redis或队列,这正是这个包独特之处。
例如,假设你有一个应用程序,有一个需要请求/响应记录的端点/路由,平均每小时被调用100次。所以,按照传统方式,这每小时只写入数据库100次,这是完全可以接受的。现在,在一个月中的一次或两次高流量日,它每小时被调用1000次,那么就是1000次写入数据库,这虽然不是很多,但仍然很多,因为应用程序的其他部分也有读写操作。使用队列作业,我们可以将这些数据库写入任务推送到作业中,但那每小时1000个作业还是有点不切实际。但使用Redis列表,我们可以将这些任务推送到Redis列表,然后一旦达到一定的限制或时间,就通过相同的作业批量将这些记录从Redis列表导入到数据库中。
此包还包括一些有用的命令来导出数据或删除数据,这些命令利用了Laravel的LazyCollection和独特方法来删除大量数据,如Freek的博客文章中所述。
安装
使用composer安装包
composer require touhidurabir/laravel-request-response-logger
发布配置和迁移文件
php artisan vendor:publish --provider="Touhidurabir\RequestResponseLogger\RequestResponseLoggerServiceProvider"
接下来,需要运行新的数据库表的迁移。在您的控制台中运行以下命令
php artisan migrate
用法
配置选项
在开始使用之前,请确保查看发布的配置文件,以了解您可以修改的可用选项/设置,因为此包提供了很多灵活性。
例如,可以将写入任务推送到由选项log_on_queue
定义的队列作业,并利用由选项store_on_redis
定义的Redis功能。这些选项都被设置为false
。所以,根据您的应用程序能力和需求,配置选项以适应您的需求。
设置中间件
最重要的一部分是设置中间件,因为所有的请求/响应记录都是由包提供的中间件\Touhidurabir\RequestResponseLogger\Middlewares\LogRequestResponse
完成的。
使用中间件有几种方法,例如在 /app/Http/Kernel.php
文件中注册它,然后像这样使用:
将其注册为命名中间件,然后仅对需要它的路由进行使用
protected $routeMiddleware = [ ... 'requests.responses.logger' => \Touhidurabir\RequestResponseLogger\Middlewares\LogRequestResponse::class, ]; // And then use it for one or more routes Route::any('/some-route', SomeController::class)->middleware(['requests.responses.logger']);
或者注册为路由中间件组
protected $middlewareGroups = [ ... 'api' => [ \Touhidurabir\RequestResponseLogger\Middlewares\LogRequestResponse::class, ], ];
或者注册为默认适用于所有路由
protected $middleware = [ ... \Touhidurabir\RequestResponseLogger\Middlewares\LogRequestResponse::class, ];
就是这样。
注意:虽然根据应用程序的需要,可能需要对每个路由的请求/响应进行日志记录,但这在现实中是非常不现实的。根据您的需求注册中间件,并尽量避免使用全局中间件,除非应用程序确实需要。
注册和运行可用命令
此包包含几个有用的命令,例如:
日志清理器
要清理日志,使用命令 request-response-logger:clear
,如下所示:
php artisan request-response-logger:clear
或者为了定期设置清理过程,将其注册在 \App\Console\Kernel
类的 schedule
方法中,如下所示:
protected function schedule(Schedule $schedule) { ... $schedule->command('request-response-logger:clear')->weekly(); }
此包还提供一些处理选项,例如:
日志导出器
要导出日志为CSV并将其存储在存储目录中,使用命令 request-response-logger:export
,如下所示:
php artisan request-response-logger:export
或者为了定期设置导出过程,将其注册在 \App\Console\Kernel
类的 schedule
方法中,如下所示:
protected function schedule(Schedule $schedule) { ... $schedule->command('request-response-logger:export')->dailyAt('00:01'); }
除非在命令中通过 --filename
选项传递了特定文件名,否则它将使用当前日期时间作为文件名。
请注意,此包当前仅导出CSV格式的文件。默认情况下,它将导出的CSV文件存储在
storage
目录中,除非提供其他路径。有关更多信息,请参阅可用的命令选项。
此包还提供一些处理选项,例如:
Redis列表存储导入器
这是唯一适用于您使用此包的Redis列表存储的命令。它将已存储在Redis中的所有日志导入到数据库表(通过配置中指定的键)。如果您需要立即导入存储在Redis列表中的所有记录而不等待配置文件中指定的 max_redis_count
,这将很有用。
运行命令如下:
php artisan request-response-logger:redis-import
或者为了定期设置导入过程,将其注册在 \App\Console\Kernel
类的 schedule
方法中,如下所示:
protected function schedule(Schedule $schedule) { ... $schedule->command('request-response-logger:redis-import')->hourly(); }
模型
如果您想处理您已记录的数据,您可以根据HTTP代码检索数据。或者,您可能想根据需要长期保留的逻辑标记一些记录。要执行此类操作,请使用配置文件中定义的 model
选项中的模式。默认情况下,它将使用 \Touhidurabir\RequestResponseLogger\Models\RequestResponseLogger::class
模型类。
默认模型还提供了一些处理方法/作用域,例如:
use Touhidurabir\RequestResponseLogger\Models\RequestResponseLogger; // Get every logged item with an http response code of 2xx: RequestResponseLogger::successful()->get(); // Get every logged item with an http response code that ISN'T 2xx: RequestResponseLogger::failed()->get(); // Get every logged item which are marked RequestResponseLogger::marked()->get();
此包还跟踪请求是否来自已登录的用户,并将用户数据与日志数据关联起来。因此,可以找到请求日志已注册为哪个用户的请求。
RequestResponseLogger::with(['user'])->get();
如果您需要更多方法,只需扩展默认模型类或创建自己的类,并将其注册到已发布的配置文件中。
贡献
欢迎提交拉取请求。对于重大更改,请首先提交问题以讨论您想要更改的内容。
请确保适当地更新测试。