mtownsend / laravel-request-response-logger
轻松捕获Laravel应用中每个传入请求及其相应的传出响应。
Requires
- php: >=7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^6.17
- phpunit/phpunit: ^9.5
README
轻松捕获Laravel应用中每个传入请求及其相应的传出响应。
本包仅设计用于Laravel框架。
安装
通过composer安装
composer require mtownsend/laravel-request-response-logger
从v1.0.X升级到v2.0.X
注册服务提供者(Laravel用户)
Laravel 5.4及以下版本,请在您的config/app.php
中添加以下行:
/* * Package Service Providers... */ Mtownsend\RequestResponseLogger\Providers\RequestResponseLoggerServiceProvider::class,
Laravel 5.5及以上版本,该包将自动为您注册提供者。
发布迁移和配置文件
在开始使用此包之前,您需要发布迁移和配置文件。请在控制台中运行以下命令:
php artisan vendor:publish --provider="Mtownsend\RequestResponseLogger\Providers\RequestResponseLoggerServiceProvider"
接下来,您需要运行新数据库表的迁移。在控制台中运行以下命令:
php artisan migrate
设置中间件(重要!)
为了开始记录请求和响应,您必须将中间件附加到您想要记录的路由上。该包 不会 为您进行此假设,因为并非每个人可能都需要记录每个路由。
现在,转到您的 /app/Http/Kernel.php
您可以选择使用哪种方法。我们提供了一些不同的选项:
选项1:将中间件绑定到您可以在需要记录的路由上调用的名称
protected $routeMiddleware = [ ... 'log.requests.responses' => \Mtownsend\RequestResponseLogger\Middleware\LogRequestsAndResponses::class, ];
然后应用该命名的中间件到任何您想要的路由
Route::post('/some/route', SomeController::class)->middleware(['log.requests.responses']);
选项2:将中间件分配给路由组
protected $middlewareGroups = [ ... 'api' => [ ... \Mtownsend\RequestResponseLogger\Middleware\LogRequestsAndResponses::class, ], ];
选项3:将中间件分配给每个路由
protected $middleware = [ ... \Mtownsend\RequestResponseLogger\Middleware\LogRequestsAndResponses::class, ];
就是这样!中间件将记录它接收到的每个传入请求!
自定义配置(可选)
此包提供了一些您可以进行的自定义。
当您导航到 app/config
时,您将看到一个 log-requests-and-responses.php
文件。它将包含以下内容:
return [ /** * The model used to manage the database table for storing request and response logs. */ 'logging_model' => \Mtownsend\RequestResponseLogger\Models\RequestResponseLog::class, /** * When logging requests and responses, should the logging action be * passed off to the queue (true) or run synchronously (false)? */ 'logging_should_queue' => false, /** * If stored json should be transformed into an array when retrieved from the database. * Set to `false` to receive as a regular php object. */ 'get_json_values_as_array' => true, /** * The class responsible for determining if a request should be logged. * * Out of the box options are: * Mtownsend\RequestResponseLogger\Support\Logging\LogAll::class, * Mtownsend\RequestResponseLogger\Support\Logging\LogClientErrorsOnly::class, * Mtownsend\RequestResponseLogger\Support\Logging\LogSuccessOnly::class, */ 'should_log_handler' => \Mtownsend\RequestResponseLogger\Support\Logging\LogAll::class, ];
维护
您可能想利用一些维护来防止您的日志表变得过大。此包提供了一个预注册的命令来清理表。您可以手动运行它。
php artisan request-response-logger:clean
您还可以在 app/Console/Kernel.php
中安排它自动运行。
protected function schedule(Schedule $schedule) { ... $schedule->command('request-response-logger:clean')->quarterly(); }
高级用法
条件日志记录
此包提供对在请求/响应记录到数据库之前指定自定义条件的支持。
它自带3个默认选项:
- LogAll - 记录请求 & 响应
- LogClientErrorsOnly - 仅记录具有4XX HTTP状态码的响应
- LogSuccessOnly - 仅记录具有2XX HTTP状态码的响应
- ...或者您自己的!
创建自己的条件逻辑相当简单,只需两个简单步骤即可完成
- 首先,创建一个自定义类来执行您的日志记录条件检查。为了演示目的,让我们假设我们将创建一个条件逻辑检查,仅记录来自外部服务的请求,而不是您自己的Web应用。您可以使用以下代码作为模板。
<?php namespace App\Support\Logging; use Illuminate\Http\Request; use Mtownsend\RequestResponseLogger\Support\Logging\Contracts\ShouldLogContract; class LogExternalRequests implements ShouldLogContract { public $request; public $response; public function __construct(Request $request, $response) { $this->request = $request; $this->response = $response; } /** * Return a truth-y value to log the request and response. * Return false-y value to skip logging. * * @return bool */ public function shouldLog(): bool { // Custom logic goes here... } }
- 打开您的
config/log-requests-and-responses.php
并将should_log_handler
键设置为您的类。
[ //... 'should_log_handler' => \App\Support\Logging\LogExternalRequests::class, ]
...就这样!您的自定义日志记录逻辑现在将在中间件执行时使用。
模型作用域
如果您想处理您已记录的数据,您可能需要根据应用程序为该请求返回的 HTTP 状态码来检索数据。
use Mtownsend\RequestResponseLogger\Models\RequestResponseLog; // Get every logged item with an http response code of 2XX: RequestResponseLog::successful()->get(); // Get every logged item with an http response code that ISN'T 2XX: RequestResponseLog::failed()->get();
用您自己的模型替换 RequestResponseLog
您可能想扩展基础 RequestResponseLog
模型。这是完全可能的。
首先,创建您自己的模型
php artisan make:model RequestResponseLog
然后在您的模型中扩展基础模型
<?php namespace App\Models; use Mtownsend\RequestResponseLogger\Models\RequestResponseLog as BaseRequestResponseLog; class RequestResponseLog extends BaseRequestResponseLog { // }
然后在您的 app/config/log-requests-and-responses.php
'logging_model' => \App\Models\RequestResponseLog::class,
现在包将使用您的模型而不是默认模型。
测试
您可以使用以下命令运行测试
vendor/bin/phpunit
许可证
MIT 许可证(MIT)。有关更多信息,请参阅许可证文件。