【问题标题】:How to Save Laravel rest Api logs into db如何将 Laravel rest Api 日志保存到数据库中
【发布时间】:2018-10-08 06:03:59
【问题描述】:

我想将所有 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:"cache-control" ;s:8:"无缓存";s:13:"邮递员令牌";s:36:"0d13fe2e-9986-4ef2-ba46-8207dd28cd44";s:10:"用户代理";s:20 :"PostmanRuntime/7.1.1";s:6:"接受";s:3:"/";s:4:"Host";s:9:"localhost";s: 6:“cookie”;s:81:“PHPSESSID=ho1oa4gjll59u4vq9usct3lev7;ci_session=ruttt4i5144hob6feq3mrv080nh2n74o”;s:15:“接受编码”;s:13:“gzip,放气”;s:14:“内容长度”; s:2:"19";s:10:"连接";s:10:"keep-alive";s:7:"user_id";i:13;}

【问题讨论】:

    标签: php laravel rest api laravel-5


    【解决方案1】:

    如果你想自己构建一些东西,可终止的中间件是 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,
        ...
    ];
    

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

    • 请求开始时间>> 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();可用吗?
    【解决方案2】:

    在 laravel 中没有这个选项。因此,您需要在 https://sergeyzhuk.me/2016/07/30/laravel-logging-to-db/ 处为此结帐编写自定义代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2020-01-15
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多