Laravel中记录请求日志需创建自定义中间件LogRequest,用microtime(true)记录起止时间、提取method/url/ip/status/duration_ms等字段,通过Log::info写入JSON结构化日志,并推荐注册到api中间件组实现精准控制。

在 Laravel 中用中间件记录请求日志,核心是创建一个自定义中间件,在请求进入和响应返回时捕获关键信息(如 URL、方法、IP、耗时、状态码等),再写入日志文件或数据库。Laravel 自带的 Log 门面或 Logger 实例足够支撑轻量级记录,无需额外包。
创建请求日志中间件
运行命令生成中间件:
php artisan make:middleware LogRequest编辑 app/Http/Middleware/LogRequest.php,在 handle 方法中记录请求开始时间,并在响应返回前补全日志条目:
- 使用
microtime(true)记录起始时间,挂载到 request 或闭包变量中 - 调用
$next($request)获取响应后,计算耗时、提取状态码、客户端 IP 等 - 用
Log::info()写入结构化日志,推荐 JSON 格式便于后续解析
记录关键字段示例
以下是一个简洁实用的日志内容建议:
- method:$request->method()
- url:$request->fullUrl()
-
ip:$request->ip()(注意反向代理场景需配置
TRUSTED_PROXIES) - status:$response->getStatusCode()
- duration_ms:round(($end - $start) * 1000, 2)
- user_id:可选,$request->user()?->id
例如:Log::info('HTTP_REQUEST', ['method' => 'GET', 'url' => '/api/users', 'ip' => '192.168.1.100', 'status' => 200, 'duration_ms' => 42.35]);
注册中间件并控制作用范围
在 app/Http/Kernel.php 中注册:
- 全局生效:加到
$middleware数组(慎用,影响所有请求,包括静态资源) - 分组生效:加到
$middlewareGroups['web']或['api'](更推荐) - 单路由生效:在路由定义中用
->middleware(LogRequest::class)
若只记录 API 请求,建议放在 api 组里,避免干扰登录、图片等非业务请求。
进阶:异步写入与日志轮转
高频请求下同步写日志可能拖慢响应,可考虑:
- 用 Laravel 的
Log::channel('daily')启用按天轮转,避免单文件过大 - 将日志写入队列任务(需配合 Redis/Database 驱动),但会丢失实时性,适合审计类场景
- 用 Monolog 的
RotatingFileHandler或第三方包如spatie/laravel-activitylog做增强记录
日常调试和监控,内置日志 + daily channel 已足够稳定高效。


















