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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:42:01