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
相关产品推荐
相关产品推荐

