必须启用结构化日志并绑定请求上下文,配置JSON格式单文件日志,监听请求结束时分析慢SQL并标记critical,再用VSCode插件以JSON树形式解析laravel.json实现高效排查。

要在Laravel项目中快速定位接口响应慢、重复查询或异常请求,必须让日志可读、可筛、可追溯。直接打开storage/logs/laravel.log看文本堆叠,效率极低,且关键上下文常被淹没。
启用结构化日志并绑定请求上下文
在app/Http/Middleware/LogRequestContext.php中创建中间件:
php artisan make:middleware LogRequestContext
编辑该文件,在handle方法中插入:
Log::shareContext([ 'request_id' => Str::uuid()->toString(), 'user_id' => auth()->id(), 'ip' => $request->ip(), 'url' => $request->fullUrl() ])
这一步必须放在所有业务逻辑执行前,否则后续日志将缺失上下文。若跳过此步,日志中无法关联请求链路,排查时将陷入“知道报错但找不到是谁干的”困境。
在app/Http/Kernel.php的$middlewareGroups['web']数组开头插入该中间件类路径。
配置日志驱动为single+json格式
修改config/logging.php中stack通道下的channels数组:
将默认的'stack' → 'daily'替换为['single'],并在'single'配置块内添加:
'formatter' => \Monolog\Formatter\JsonFormatter::class,
同时确保'driver' => 'single','path' => storage_path('logs/laravel.json'),'level' => 'debug'
⚠️注意:不要保留'daily'和'json'混用配置,否则laravel.json里会混入非JSON行,导致VSCode日志插件解析失败。
实时抓取慢SQL并标记为critical
第一步:在AppServiceProvider的boot方法中启用查询日志
DB::enableQueryLog();
第二步:监听kernel.terminate事件,在请求结束时分析查询
Event::listen(Illuminate\Foundation\Events\RequestHandled::class, function ($event) {
$queries = DB::getQueryLog();
foreach ($queries as $query) {
if ($query['time'] > 300) { // 超过300ms标为critical
Log::critical('Slow SQL detected', [
'sql' => $query['query'],
'bindings' => $query['bindings'],
'runtime_ms' => $query['time']
]);
}
}
});
用VSCode插件解析laravel.json日志
方法一:安装扩展Log File Highlighter
方法二:安装扩展JSON Tools(必须启用其“JSON viewer”功能)
打开storage/logs/laravel.json后,右键→“JSON Tools: View as JSON Tree”
此时日志按时间戳自动排序,可点击任意字段展开查看上下文数组,例如展开context → user_id即可批量筛选某用户全部操作
搜索框输入"critical"可立即定位所有慢SQL条目,再点开对应条目的sql字段,复制粘贴到Tinker中复现验证


















