关于收集此次所有日志的问题

问题描述

laravel框架5.8

先看一下现在的日志吧

{"log_times":"2022-11-09 00:15:44","request_id":771070115,"client_ip":"127.0.0.1","request_path":"product/test","message":"token----------------------eyJpZCI6IjEiLCJuYW1lIjoiQWRtaW4iLCJjb2RlIjoiYWRtaW4iLCJyb2xlIjpudWxsLCJpYXQiOjE2Njc4Mjc2MDEsImV4cCI6MTY3MzAxMTYwMSwicGxhdGZvcm1UeXBlIjpudWxsLCJwbGF0Zm9ybURhdGEiOnsiaWQiOiIxIiwibmFtZSI6ImFkbWluIiwic3VwZXIiOiIwMDAwIn19.5ad2744c3f4b4e7a123176567092a31d"}
{"log_times":"2022-11-09 00:15:44","request_id":843106128,"client_ip":"127.0.0.1","request_path":"product/test","message":"客户端验证--- "}
{"log_times":"2022-11-09 00:15:44","request_id":550717236,"client_ip":"127.0.0.1","request_path":"product/test","message":"test"}
{"log_times":"2022-11-09 00:15:45","request_id":124240686,"client_ip":"127.0.0.1","request_path":"product/test","message":"回滚错误日志--SQLSTATE[42S22]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'aaaa' 无效。 (SQL: insert into [spd_aatest1] ([name], [aaaa]) values (1290, xxx))"}
{"log_times":"2022-11-09 00:15:45","request_id":213659193,"client_ip":"127.0.0.1","request_path":"product/test","message":"Err::数据错误,请联系管理员!, code::9999"}
{"log_times":"2022-11-09 00:15:45","request_id":672435311,"client_ip":"127.0.0.1","request_path":"product/test","message":"数据错误,请联系管理员!"}
{"log_times":"2022-11-09 00:15:45","request_id":406119165,"client_ip":"127.0.0.1","request_path":"product/test","message":"api_request_finished"}

现在请求一次API,会产品这么行日志,从token开始,到messaesapi_request_finished时结束
过程中的路由位置、SQL执行的语句等都做了处理,所以才会这么多
但是这种方式并不方便后期查看,一天的log文件就得10几MB

预想的结果
在写入log的地方做个断点,先将每次打印的信息收集起来,等到本次API完全结束时,序列化所有的信息在写入,这样就能一个API对应一条LOG了,但是不清楚怎么判断本次API请求结束

    public function format(array $record)
    {
        $request = app('request');
        $rand = rand(100000000,999999999);

        // 收集到每次的日志信息并存放在一个地方
        $newRecord = [
            'log_times' => $record['datetime']->format('Y-m-d H:i:s'),
            'request_id' =>  $rand,
            'client_ip' =>$request->getClientIp(),
            'request_path' => $request->path(),
            'message' => $record['message'],
        ];
        if (!empty($record['context'])){
            $newRecord = array_merge($newRecord,$record['context']);
        }

        /**
         * 请求结束,最后统一写入
         */
        $json = $this->toJson($this->normalize($newRecord), true) . ($this->appendNewline ? "\n" : '');
        return $json;

    }

不知道这种方式可不可取,或是有没有更好的方法

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

可终止的中间件

有时,在将 HTTP 响应发送到浏览器之后,中间件可能需要做一些工作。如果您在中间件上定义了一个 terminate 方法,并且您的 Web 服务器使用 FastCGI,则在将响应发送到浏览器后会自动调用 terminate 方法:

中间件《Laravel 9 中文文档》

1年前 评论

谢谢 我这试试

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!