如何使用 Guzzle 6 记录所有 API 调用

2022-08-30 18:45:30

我正在尝试使用gzzle 6,这很好,但是在如何记录所有api调用时,我迷失了方向。我想简单地记录计时,从会话登录用户,url以及与API调用相关的任何其他常用相关信息。我似乎找不到Guzzle 6的任何文档提到这一点,只有guzzle 3(他们已经更改了日志记录addSubscriber调用)。这就是我当前的 API 调用方式:

$client = new GuzzleHttp\Client(['defaults' => ['verify' => false]]);
$res = $client->get($this->url . '/api/details', ['form_params' => ['file' => $file_id]]);

答案 1

您可以使用任何与Guzzle 6一起实现PSR-3接口的记录器

在下面的示例中,我使用Monolog作为Loger和Guzzle的内置中间件与MessageFormatter。

use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\MessageFormatter;
use Monolog\Logger;

$stack = HandlerStack::create();
$stack->push(
    Middleware::log(
        new Logger('Logger'),
        new MessageFormatter('{req_body} - {res_body}')
    )
);
$client = new \GuzzleHttp\Client(
    [
        'base_uri' => 'http://httpbin.org',
        'handler' => $stack,
    ]
);

echo (string) $client->get('ip')->getBody();

有关日志中间件和消息格式化程序的详细信息尚未详细记录。但是,您可以检查可以在 MessageFormatter 中使用的变量列表

此外,还有一个gzzle-logmiddleware,允许您自定义格式化程序等。


答案 2

@KingKongFrog 这是指定日志文件名称的方法

$logger = new Logger('MyLog');
$logger->pushHandler(new StreamHandler(__DIR__ . '/test.log'), Logger::DEBUG);

$stack->push(Middleware::log(
$logger,
new MessageFormatter('{req_body} - {res_body}')
));

推荐