You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10中间件实现API日志入库及Lumen批量记录请求响应方案

问题1:Laravel 10 中创建中间件记录所有API请求与响应到数据库

步骤1:创建记录中间件

运行Artisan命令生成中间件:

php artisan make:middleware LogApiRequestResponse

在app/Http/Middleware/LogApiRequestResponse.php中编写逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;

class LogApiRequestResponse
{
    public function handle(Request $request, Closure $next)
    {
        // 记录基础请求信息
        $logData = [
            'method' => $request->method(),
            'path' => $request->path(),
            'request_body' => $request->getContent(),
            'ip' => $request->ip(),
            'created_at' => now(),
        ];

        // 执行请求并获取响应
        $response = $next($request);

        // 补充响应信息到日志数据
        $logData['response_body'] = $response->getContent();
        $logData['status_code'] = $response->getStatusCode();
        $logData['updated_at'] = now();

        // 写入数据库(也可以用模型替代DB门面,按需选择)
        DB::table('api_request_logs')->insert($logData);

        return $response;
    }
}

步骤2:创建数据库日志表

生成迁移文件:

php artisan make:migration create_api_request_logs_table

在迁移文件中定义表结构:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('api_request_logs', function (Blueprint $table) {
            $table->id();
            $table->string('method');
            $table->string('path');
            $table->text('request_body')->nullable();
            $table->text('response_body')->nullable();
            $table->integer('status_code');
            $table->string('ip');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('api_request_logs');
    }
};

运行迁移创建表:

php artisan migrate

步骤3:注册中间件

打开app/Http/Kernel.php,在$middlewareGroups的api组中添加该中间件:

protected $middlewareGroups = [
    'api' => [
        // 保留原有中间件
        \App\Http\Middleware\LogApiRequestResponse::class,
    ],
];

至此,所有API请求的请求/响应数据都会自动写入数据库。


问题2:Lumen 项目批量记录API请求响应(无需修改现有接口)

最优方案是通过全局中间件实现,完全不需要改动已有300个接口的代码,直接对所有API请求生效。

步骤1:创建记录中间件

在app/Http/Middleware目录下新建LogApiRequestResponse.php:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class LogApiRequestResponse
{
    public function handle(Request $request, Closure $next)
    {
        $logData = [
            'method' => $request->method(),
            'path' => $request->path(),
            'request_body' => $request->getContent(),
            'ip' => $request->ip(),
            'created_at' => now(),
        ];

        $response = $next($request);

        $logData['response_body'] = $response->getContent();
        $logData['status_code'] = $response->getStatusCode();
        $logData['updated_at'] = now();

        DB::table('api_request_logs')->insert($logData);

        return $response;
    }
}

步骤2:创建数据库日志表

和Laravel流程一致,生成并运行迁移:

php artisan make:migration create_api_request_logs_table

迁移文件内容与问题1中的完全相同,运行迁移:

php artisan migrate

步骤3:注册中间件

打开bootstrap/app.php,根据需求选择注册方式:

  • 全局生效:取消中间件注释并添加:
$app->middleware([
    \App\Http\Middleware\LogApiRequestResponse::class,
]);
  • 仅API路由组生效:先注册路由中间件别名,再绑定到路由组:
$app->routeMiddleware([
    'api.log' => \App\Http\Middleware\LogApiRequestResponse::class,
]);

// 在路由定义中使用
$app->group(['middleware' => 'api.log'], function () use ($app) {
    // 所有API路由
});

可选:轻量包方案

如果不想手动编写中间件,可以选择兼容Lumen的轻量日志包(如基于中间件实现的工具),但注意:

  • 需确认包与你的Lumen版本兼容
  • 多数包底层逻辑和手动中间件一致,自定义灵活性不如手动实现
  • 若需添加特殊字段(如用户ID、请求耗时),手动实现更可控

内容的提问来源于stack exchange,提问作者Rk dev tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:15:27