首页 > 解决方案 > 如何将 Laravel rest Api 日志保存到数据库中

问题描述

我想将所有 api 日志保存在 db 中。例如,每当一个 api 被命中时,它的请求和响应都会保存在一个表中。

Lavavel 中是否有设置可以将 Rest apis 的日志启用到数据库中。

例如在 codeigniter 中:请求参数日志为:a:12:{s:13:"session_token";s:20:"OiCtWkqBLm6ScaSHOmQR";s:12:"Content-Type";s:16:"application/json" ;s:13:"缓存控制";s:8:"无缓存";s:13:"邮递员令牌";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-长度";s:2:"19";s:10:"连接";s:10:"keep-alive";s:7:"user_id";i:13;}

标签: phplaravelrestapilaravel-5

解决方案


如果你想自己构建一些东西,可终止的中间件是 Laravel 中一个很好的解决方案。在完成所有繁重的工作(处理请求和响应等)之后执行这种类型的中间件。

添加一个新模型来存储您的 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,
    ...
];

在中间件中,您可以向属性添加大量内容。注入的响应和请求中有很多信息:

  • 请求开始时间 >> 日期('Ymd H:i:s', LARAVEL_START)

  • URL >> 请求->fullUrl()

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

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

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

  • ip >> $request->ip()

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

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

顺便说一句,这是您可以使用的代码结构示例,为您提供有关解决方案的基本概念。显然,您需要为模型、迁移等添加正确的属性。但我相信您可以处理这部分......

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


推荐阅读