如何将Laravel Rest API日志保存到数据库中

7

我想要将所有 API 日志保存在数据库中。例如,每当调用一个 API 时,它的请求和响应都会保存在一个表中。

Laravel 中是否有设置以将 REST API 日志记录到数据库中。

例如在 CodeIgniter 中: 请求参数日志如下: a:12:{s:13:"session_token";s:20:"OiCtWkqBLm6ScaSHOmQR";s:12:"Content-Type";s:16:"application/json";s:13:"cache-control";s:8:"no-cache";s:13:"Postman-Token";s:36:"0d13fe2e-9986-4ef2-ba46-8207dd28cd44";s:10:"User-Agent";s:20:"PostmanRuntime/7.1.1";s:6:"Accept";s:3:"/";s:4:"Host";s:9:"localhost";s:6:"cookie";s:81:"PHPSESSID=ho1oa4gjll59u4vq9usct3lev7; ci_session=ruttt4i5144hob6feq3mrv080nh2n74o";s:15:"accept-encoding";s:13:"gzip, deflate";s:14:"content-length";s:2:"19";s:10:"Connection";s:10:"keep-alive";s:7:"user_id";i:13;}

2个回答

17

如果你想要自己构建东西,在 Laravel 中,可以使用可终止中间件(terminable middleware)。这种类型的中间件在所有重要工作完成后执行(如处理请求和响应等)。

添加一个新模型来存储您的 LogEntries(日志条目)。创建您的迁移等基本 Laravel 细节我就不解释了... :-)

然后,为了开始使用中间件,请创建一个类似于以下代码的中间件类:

$ php artisan make:middleware RequestLoggerMiddleware
在新类中添加一个主体:
class RequestLoggerMiddleware
{

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate(Request $request, Response $response)
    {
        $logEntry = new LogEntry();

        $logEntry->attribute = VALUE;
        $logEntry->attribute = VALUE;
        $logEntry->attribute = VALUE;
        $logEntry->attribute = VALUE;

        $logEntry->save();
    }
}

将中间件添加到您的Kernel.php:

protected $middleware = [
    ...
    RequestLoggerMiddleware::class,
    ...
];
在中间件中,您可以向属性添加大量信息。注入的响应和请求中有很多信息:
  • 请求开始时间 >> date('Y-m-d H:i:s', LARAVEL_START)

  • URL >> request->fullUrl()

  • 请求 HTTP 方法 >> $request->method()

  • 请求正文 >> json_decode($request->getContent(), true);

  • 请求头 >> $request->header();

  • ip >> $request->ip()

  • 状态码 >> $response->getStatusCode()

  • 响应正文 >> json_decode($response->getContent(), true);

顺便说一句,这是一个您可以使用的代码结构示例,以便让您对解决方案有一个基本的了解。显然,您需要将正确的属性添加到模型、迁移等中。但我相信您可以处理好那一部分...

并且:在构造函数中注入模型而不是上面的示例... :-)


我认为可以使用json_encode代替上次请求和响应中所做的json_encode或者使用$request->getContent()。 - İbrahim

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接