如何在Laravel中调用HTTP请求时实现全局日志记录?
实现方案
你之前的写法不生效的核心原因是:Http::get() 执行后返回的是 Illuminate\Http\Client\Response 响应实例,而非 Http 门面本身,所以宏需要定义在响应类上,而非 Http 门面。
第一步:注册全局宏
打开 app/Providers/AppServiceProvider.php,在 boot 方法中添加以下代码:
<?php namespace App\Providers; use Illuminate\Http\Client\Response; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // 全局开启请求追踪,才能正常获取请求相关信息 Http::globalOptions([ 'track_requests' => true, ]); // 给响应类注册log宏 Response::macro('log', function () { // $this 指向当前请求的响应实例 Log::info('HTTP 请求全链路日志', [ 'request_method' => $this->transferStats?->getRequest()->getMethod(), 'request_url' => (string) $this->transferStats?->getRequest()->getUri(), 'request_headers' => $this->transferStats?->getRequest()->getHeaders(), 'request_body' => $this->transferStats?->getRequest()->getBody()->getContents(), 'response_status' => $this->status(), 'response_body' => $this->body(), 'transfer_time' => $this->transferStats?->getTransferTime() . 's', ]); // 返回响应实例,支持后续链式调用其他响应方法 return $this; }); } }
第二步:调用方式
和你期望的用法完全一致:
// 调用后自动写日志,同时可以正常使用响应实例的所有方法 $response = Http::get('http://example.com')->log(); // 后续正常操作,比如获取响应数据 $data = $response->json();
可选优化
如果不想每次请求都手动加 ->log(),可以直接监听 Laravel 内置的 HTTP 客户端事件实现全局自动日志,不需要修改任何请求调用代码:
- 监听
Illuminate\Http\Client\Events\ResponseReceived事件,在事件处理类中统一写日志即可。
内容的提问来源于stack exchange,提问作者mohammad nabipour
相关产品推荐
相关产品推荐

