laravel 实现异步记录日志

1. 运行环境

lnmp

1). 当前使用的 Laravel 版本?

8.4

2). 当前使用的 php/php-fpm 版本?

PHP 版本:
7.4
php-fpm 版本:
7.4//: <> (期待数值 Windows 10 / Ubuntu 20.4 / CentOS 8 )

2. 问题描述?

记录info级别的日志,但是日志量太大,怎么实现异步记录日志
我有一个记录sql的服务提供者,这一操作可以实现异步操作吗
laravel 实现异步记录日志

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

可以用这两个方法,即先返回数据给客户端。然后再执行记录日志的操作,不影响请求响应时间

App::terminating(function () {
});

app()->terminating(function () {

});

例子

public function test(Request $request)
    {
        $log     = 'log msg';
        $context = [
            'request_id' => 'xxxx',
            'client_ip'  => $request->getClientIp(),
            'time'       => time()

        ];

       //闭包里的代码是在将页面返回给用户客户端之后再执行的,不影响响应时间
        \App::terminating(function () use ($log, $context) {
            Log::info($log,$context);
        });
        return view('test');
    }
3周前 评论
Not404 (楼主) 3周前
讨论数量: 12

可以先放到redis里面,然后异步写入到日志服务

3周前 评论

middleware 有个 terminate 方法,不会阻塞响应

3周前 评论
Not404 (楼主) 3周前
cvoid 3周前
Not404 (楼主) 3周前
JaguarJack (作者) 3周前

搞个事件,放队列记录就行了

3周前 评论

fpm 用 terminate 中间件。

artisan 监听 CommandFinished 事件。

3周前 评论
jiangjun

我咋记得laravel 本来就是异步记录日志

3周前 评论

首先你这个不是异步的,,,

3周前 评论

可以用这两个方法,即先返回数据给客户端。然后再执行记录日志的操作,不影响请求响应时间

App::terminating(function () {
});

app()->terminating(function () {

});

例子

public function test(Request $request)
    {
        $log     = 'log msg';
        $context = [
            'request_id' => 'xxxx',
            'client_ip'  => $request->getClientIp(),
            'time'       => time()

        ];

       //闭包里的代码是在将页面返回给用户客户端之后再执行的,不影响响应时间
        \App::terminating(function () use ($log, $context) {
            Log::info($log,$context);
        });
        return view('test');
    }
3周前 评论
Not404 (楼主) 3周前

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