touhidurabir/laravel-request-response-logger

一个PHP Laravel包,以优雅的方式结合队列和Redis,在数据库中记录应用程序的请求/响应

1.0.0 2021-12-26 11:47 UTC

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

如果您需要更多方法,只需扩展默认模型类或创建自己的类,并将其注册到已发布的配置文件中。

贡献

欢迎提交拉取请求。对于重大更改,请首先提交问题以讨论您想要更改的内容。

请确保适当地更新测试。

许可证

MIT