mtownsend/laravel-request-response-logger

轻松捕获Laravel应用中每个传入请求及其相应的传出响应。

2.0.0 2022-10-08 23:10 UTC

This package is auto-updated.

Last update: 2024-09-19 04:13:22 UTC


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状态码的响应
  • ...或者您自己的!

创建自己的条件逻辑相当简单,只需两个简单步骤即可完成

  1. 首先,创建一个自定义类来执行您的日志记录条件检查。为了演示目的,让我们假设我们将创建一个条件逻辑检查,仅记录来自外部服务的请求,而不是您自己的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...
    }
}
  1. 打开您的 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)。有关更多信息,请参阅许可证文件